Traversal
Preorder Traversal
114 Flatten Binary Tree to Linked List
Revised preorder traversal
这道题,乍一看好像很简单,直接pre-order traversal (curr -> L -> R),然后按顺序依次转化成rootNode的右子树。这样的话,我们需要另一个数组存储我们的pre-order traversal,再依次粘贴到rootNode的右子树上。
我们可以用递归,从右子树开始扫起,进行 reverse preorder,即 R -> L -> curr。同时keep 一个 global 的 prev pointer, pointing to the last executed node. 每次我们需要对当前node进行,root.right = prev, root.left = null, prev = root
public void flatten(TreeNode root) {
helper(root, null);
}
private TreeNode helper(TreeNode root, TreeNode pre) {
if (root == null) return pre;
pre = helper(root.right, pre);
pre = helper(root.left, pre);
root.right = pre;
root.left = null;
return root;
}
Inorder Traversal
94 Binary Tree Inorder Traversal
Iterative 方法 in order 遍历二叉树。借助 Stack 实现。
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
Deque<TreeNode> stack = new LinkedList<>();
TreeNode cur = root;
while(cur != null || !stack.isEmpty() ) {
if (cur != null) {
stack.offerLast(cur);
cur = cur.left;
} else {
cur = stack.pollLast();
res.add(cur.val);
cur = cur.right;
}
}
return res;
}
Postorder Traversal
145 Binary Tree Postorder Traversal
循环的方式后序遍历二叉树。记忆点:1.从上往下和从下往上的过程不太一样,需要分开讨论。2.从上往下的时候,需要先遍历左子树,再右子树,最后是节点。3.从下往上的时候,也有两种情况,第一种是从右子树上来或者左子树上来并且已无右子树可以遍历,第二种是从左子树上来并且还有右子树可以遍历。
Last updated