Tree的性质
Divide and Conquer模版
1 | def traversal(root): |
小技巧
T O(n) 一般是遍历所有点
S O(h) 用堆栈来做的话是遍历所有点
O(n) 用队列实现遍历所有点
104. Maximum Depth of Binary Tree
深度等于子树高度+1
T O(n)
S O(h)
1 | class Solution(object): |
111. Minimum Depth of Binary Tree
和上一道题相比,需要判断树的情况,如果一个node的左儿子为空 右儿子不空 从root 到左儿子的路径不算是minimum depth
因为左儿子不算这个node的leaf node。
T O(n)
S O(h)
1 | class Solution(object): |
110. Balanced Binary Tree
这道题和上面的类似,都是找深度,由于要返回一个boolean值,所以多用一个helper function
T O(n)
S O(h)
1 | class Solution(object): |
100. Same Tree
我们考虑一下结束条件,如果两个结点都是null,也就是到头了,那么返回true。如果其中一个是null,说明在一棵树上结点到头,另一棵树结点还没结束,即树不相同,或者两个结点都非空,并且结点值不相同,返回false。最后递归处理两个结点的左右子树,返回左右子树递归的与结果即可。
T O(n)
S O(h)
1 | class Solution(object): |
101. Symmetric Tree
本质上和上一题一样,区别就是从两棵树到左右孩子。
T O(n)
S O(h)
1 | class Solution(object): |
三种遍历
recursion
recursion的方法很简单 Time O(n) Space O(1)
1 | class Solution(object): |
iterative
因为不能使用recursion,所以我们要模拟构建栈。
前序遍历(pre-order):
根->左->右1. 对root异常处理 2.cur 指向root, 循环条件为node!=null || !stack.isEmpty() 3.当cur不为空,就压入stack,并将元素加入结果,cur继续往左边找 4.当cur为空,就cur就为pop出的栈顶元素,.cur继续往右边找. 5.返回最终结果集合.
T O(n)
S O(h)
1 | class Solution(object): |
中序遍历
本质上是一样的,先访问左孩子所以就一路到底
1 | class Solution(object): |
后序遍历
这个需要一点技巧以及练习,因为根节点需要访问两次,所以就需要判断是否已经访问过右节点了
1 | class Solution(object): |
不过还有一种更加巧妙的办法,前序遍历和后续遍历能否直接颠倒呢?答案是否定的,我们来看看前序遍历:根-左子树-右子树
后序遍历:左子树-右子树-根 把前序遍历倒过来:右子树-左子树-根 !左右子树相反,不能直接倒!
但是这题,哼哼哼,先左子树入栈,在右子树入栈!最后输出颠倒一下即可!
1 | class Solution: |
116. Populating Next Right Pointers in Each Node
前序遍历的性质的小变种题目
1 | class Solution: |
层序遍历
基本思想便是套用BFS模版,用queue实现,在Python中可以通过引入Deque
102. Binary Tree Level Order Traversal
这是基本题型,外层queue记录第几层,内层size记录当前层所存储的节点
T O(V+E)
S O(n)
1 | class Solution(object): |
107. Binary Tree Level Order Traversal II
本质上和上一道题一样,只是在外层倒叙输出
1 | class Solution(object): |
103. Binary Tree Zigzag Level Order Traversal
类似的题,在内层倒叙输出,设置flag记录奇偶
1 | class Solution(object): |
637.Average of Levels in Binary Tree
层序遍历的基础上,每层的average
1 | class Solution(object): |
314. Binary Tree Vertical Order Traversal
也是BFS traverse题,中间存贮index的值
1 | # Definition for a binary tree node. |
Path系列问题
技巧
基本上是可以用递归和分治的方法来进行解决,存在解和所有解都是一样的操作
257. Binary Tree Paths
输出所有路径,DFS递归,然后到叶子结点的时候返回
1 | class Solution(object): |
112. Path Sum
1 | T O(n) |
113. Path Sum II
发现解的时候需要list(temp)
1 | class Solution(object): |
129. Sum Root to Leaf Numbers
每一条往下传的时候,根据题目要求prev * 10 + root.val
,然后分治相加
1 | class Solution(object): |
124. Binary Tree Maximum Path Sum
这道题相比上一道题区别在于每个结点的local max 不一样,这道题是不需经过根节点的,所以可以变成无向图,然后分成四种情况: root.val, root.val+root.left.val, root.val+root.right.val
这三种是可以继续向上传的,root.val+root.left.val+root.right.val
这种是不可以往上传的,所以这些情况可以进行local比较,最终返回global max
1 | class Solution(object): |
563. Binary Tree Tilt
这道题根据题设,每次结点的返回值是其左右孩子和本身的和,然后每次更新abs()
1 | class Solution(object): |
Binary Search Tree性质
这种题目是根据其性质,左孩子永远比根节点小,右孩子永远比根节点大
235. Lowest Common Ancestor of a Binary Search Tree
1 | class Solution(object): |
270. Closest Binary Search Tree Value
1 | class Solution(object): |
272. Closest Binary Search Tree Value II
这道题要维持一个k长度的list,所以可以中序遍历,然后不断更新最后添加元素和队列首元素与target的差值
1 | class Solution(object): |