defpreorderIterative(root): ifnot root: return [] stack = [root] result = [] while stack: node = stack.pop() result.append(node.val) if node.right: stack.append(node.right) if node.left: stack.append(node.left) return result
4.3 分治法
分治法常用于解决需要处理左右子树的问题。
例如,判断两棵树是否相同:
1 2 3 4 5 6
defisSameTree(p, q): ifnot p andnot q: returnTrue ifnot p ornot q: returnFalse return (p.val == q.val) and isSameTree(p.left, q.left) and isSameTree(p.right, q.right)
4.4 层次遍历
层次遍历常用于需要逐层处理树节点的问题。
例如,找出二叉树的右视图:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
defrightSideView(root): ifnot root: return [] queue = deque([root]) result = [] while queue: level_size = len(queue) for i inrange(level_size): node = queue.popleft() if i == level_size - 1: result.append(node.val) if node.left: queue.append(node.left) if node.right: queue.append(node.right) return result