Posted onEdited onInLeetcodeViews: Valine: Symbols count in article: 11kReading time ≈10 mins.
Tree的性质
Divide and Conquer模版
1 2 3 4 5 6 7 8 9 10 11 12
deftraversal(root): # none or leaf ifnot root: # do sth # divide left = traversal(root.left) right = traversal(root.right) # Conquer res = # merge return res
小技巧
T O(n) 一般是遍历所有点 S O(h) 用堆栈来做的话是遍历所有点 O(n) 用队列实现遍历所有点
104. Maximum Depth of Binary Tree
深度等于子树高度+1 T O(n) S O(h)
1 2 3 4 5 6 7 8 9 10 11
classSolution(object): defmaxDepth(self, root): """ :type root: TreeNode :rtype: int """ ifnot root: return0 left = self.maxDepth(root.left) right = self.maxDepth(root.right) return max(left,right) + 1
111. Minimum Depth of Binary Tree
和上一道题相比,需要判断树的情况,如果一个node的左儿子为空 右儿子不空 从root 到左儿子的路径不算是minimum depth 因为左儿子不算这个node的leaf node。 T O(n) S O(h)
这道题和上面的类似,都是找深度,由于要返回一个boolean值,所以多用一个helper function
T O(n) S O(h)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
classSolution(object): defisBalanced(self, root): """ :type root: TreeNode :rtype: bool """ return self.check(root) == -1 defcheck(self, root): ifnot root: return-1 left = self.isBalanced(root.left) right = self.isBalanced(root.right) if left == -1or right == -1or abs(left-right) > 1: return-1 else: return max(left, right) + 1
100. Same Tree
我们考虑一下结束条件,如果两个结点都是null,也就是到头了,那么返回true。如果其中一个是null,说明在一棵树上结点到头,另一棵树结点还没结束,即树不相同,或者两个结点都非空,并且结点值不相同,返回false。最后递归处理两个结点的左右子树,返回左右子树递归的与结果即可。 T O(n) S O(h)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
classSolution(object): defisSameTree(self, p, q): """ :type p: TreeNode :type q: TreeNode :rtype: bool """ ifnot p andnot q: returnTrue ifnot p ornot q: returnFalse if p.val != q.val: returnFalse return self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)
classSolution: # @param root, a tree node # @return a list of integers defpostorderTraversal(self, root): ifnot root: return [] ans,q=[],[] q.append(root) while q: cur=q.pop() if cur.left: q.append(cur.left) if cur.right: q.append(cur.right) ans.append(cur.val) return ans[::-1]
116. Populating Next Right Pointers in Each Node
前序遍历的性质的小变种题目
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
classSolution: # @param root, a tree link node # @return nothing defconnect(self, root): ifnot root: return if root.left: root.left.next = root.right if root.right: if root.next: root.right.next = root.next.left else: root.right.next = None self.connect(root.left) self.connect(root.right)
层序遍历
基本思想便是套用BFS模版,用queue实现,在Python中可以通过引入Deque
102. Binary Tree Level Order Traversal
这是基本题型,外层queue记录第几层,内层size记录当前层所存储的节点 T O(V+E) S O(n)
classSolution(object): defsumNumbers(self, root): """ :type root: TreeNode :rtype: int """ return self.helper(root, 0) defhelper(self, root, total): ifnot root: return0 ifnot root.left andnot root.right: return total * 10 + root.val left = self.helper(root.left, total*10 + root.val) right = self.helper(root.right, total*10 + root.val) return left + right
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