三序遍历,vertical order
public class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
if(root != null) stack.push(root);
while(!stack.isEmpty()){
TreeNode node = stack.pop();
list.add(node.val);
// Remember to reverse order.. right -> left
if(node.right != null) stack.push(node.right);
if(node.left != null) stack.push(node.left);
}
return list;
}
}在写 parent 指针遍历的时候,应该多想想 stack 写法每次 pop 的回溯位置,是很重要的参考。
测试了几个 case 没有问题的代码:

追溯流程主要就是图中这两步。
stack 写法要记住的细节是,两个 while 循环里都是 cur != null
getSuccessor() 流程,其实有点像 morris - traversal:
BST 里面,任意位置,任意楼层,都可以通过 value 的比较确定相对位置,这是 BST 一个最好用的性质。
因此在 BST 里面,确定起来就很简单了,从 root 往下走,每次往左拐的时候,存一下,记录着最近一个看到的比 p.val 大的 node 就行了。
顺着这个思路讲,BST 里面找 in-order predecessor 也特简单,这次往左走的时候不记,往右走的时候记,就行了。
这种写法的主要缺点是,当 tree 非常大我们只需要输出正确结果时,reverse list 的写法必须依赖于存储所有的
Last updated