【LeetCode】二叉树习题个人总结
近一个月来,刷了不少LeetCode题目。但是总还是感觉提高的不多,自己最初想的一边做一边总结的初衷也没有正常执行,今晚静下心来,总结一下和二叉树有关的题目。
基础题目:
【二叉树遍历】
Binary Tree Postorder Traversal
Binary Tree Preorder Traversal
Binary Tree Inorder Traversal
三道习题,即二叉树后序、先序以及中序遍历,个人感觉有一道题就够了。这三道题很基础,基本数据结构主要用到栈,题目要求使用迭代求解,按照算法导论上的着色方式即可完成,没什么多说的。
以Postorder(后序)遍历为例,算法主要思想如下:
a) 初始化,根节点着白色入栈;
b) 如果栈为空,则遍历完成,转d),否则弹栈转c)
c) 弹栈,判断出栈元素,若为白色(第一次发现),将其着红色入栈,然后将其左儿子入栈着白色(第一次发现)入栈;
若为红色,将其着为黑色(第二次发现,表明其左子树已经遍历完成)入栈,将其右子树着白色入栈(开始遍历其右子树);
若为黑色(第三次发现,此时左右子树军遍历完成),输出当前节点,此时以该节点为根的子树已经遍历完成;
转b)
d) 遍历完成算法结束。
以上算法中的栈,可以使用vector,stack等多种方式实现。
【二叉树广度遍历】
Binary Tree Level Order Traversal
Binary Tree Level Order Traversal II
Binary Tree Zigzag Level Order Traversal
三个题目,都是按照广度优先遍历二叉树,其实主要用到数据结构队列。算法这里不细说了,可以直接看代码。
【构造二叉树】
Construct Binary Tree from Inorder andPostorder Traversal
Construct Binary Tree from Preorder and InorderTraversal
Note:
You may assume that duplicates do not exist in thetree.
题目给出提示说,可以假设二叉树中不存在重复元素,这一点很重要,因为这两道题的主要思路都是根据先序或后续序列确定根,然后再依据中序序列将具体的序列分解为左右子树所对应的中序序列和先序(后序)序列。然后递归构造即可。
【平衡二叉树】
Balanced Binary Tree
Convert Sorted List to Binary Search Tree
Convert Sorted Array to Binary Search Tree
这里首先明确平衡二叉树(Balance Binary Tree)的概念,平衡二叉树指的是它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。构造与调整方法 平衡二叉树的常用算法有红黑树、AVL、Treap、伸展树等。
首先Balance Binary Tree的判断,我这里采用递归的方法。
剩下两道题,根据有序序列构造平衡二叉查找树,区别在于有序序列给出的方式不同,主要思想就是选取有序序列中的中间元素作根,递归构造即可。
【枚举二叉查找树】
Unique Binary Search Trees
Unique Binary Search Trees II
题目说是唯一的二叉查找树,但实际上确实给出一个n,求出1~n的序列能够所有的不同结构的二叉查找树。
【改变二叉树结构】
Flatten Binary Tree to Linked List
Recover Binary Search Tree
Populating Next Right Pointers in Each Node
Populating Next Right Pointers in Each Node II
【二叉树判等】
Symmetric Tree
Same Tree
【二叉树结构判等】
Binary Tree Maximum Path Sum
Lowest Common Ancestor of a Binary Tree Part I