三序遍历以及Vertical Order
来源:互联网 发布:手机视力测试软件 编辑:程序博客网 时间:2024/06/05 20:13
Binary Tree Preorder Traversal
- preorder 直接用 stack;
- inorder 用 stack + cur;
- postorder 用 stack + cur + prev;
递归 ✓
迭代 ✓
parent ✓
复杂度 ✓
迭代的写法过于 trivial 就不细说了,记得因为 stack 先入后出的特点,push 的时候先 push 右边的就行。
Binary Tree Inorder Traversal
- inorder 用 stack + cur;
stack 写法要记住的细节是,两个while循环里面都是(cur != null)
public class Solution { public List<Integer> inorderTraversal(TreeNode root) { List<Integer> list = new ArrayList<Integer>(); Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode cur = root;(1)准备一插到底(左子树)
while(
cur != null ||
!stack.isEmpty()){
(2)
while(cur != null){ stack.push(cur); cur = cur.left; }(3)
TreeNode node = stack.pop(); list.add(node.val);
cur =
node.right;
(4)
} return list; }}
Inorder Successor in BST
因此在 BST 里面,确定起来就很简单了,从 root 往下走,如果当前结点root的val > p.val,左拐。每次往左拐的时候,存一下,记录着最近一个看到的比 p.val 大的 node 就行了。如果root.val > p.val,右拐。
public class Solution { public TreeNode inorderSuccessor(TreeNode root, TreeNode p) { TreeNode rst = null; while(root != null){ if(root.val > p.val){ rst = root; root = root.left; } else { root = root.right; } } return rst; }}
Inorder Predecessor in BST
这次往左走的时候不记,往右走的时候记,就行了。
public class Solution { public TreeNode inorderSuccessor(TreeNode root, TreeNode p) { TreeNode rst = null; while(root != null){ if(root.val > p.val){ root = root.left; } else { rst = root; root = root.right; } } return rst; }}
Binary Tree Postorder Traversal
public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<Integer>();
if(root == null)
return res;
Stack<TreeNode> s = new Stack(), path = new Stack();
s.push(root);
while(!s.isEmpty()){
TreeNode cur = s.peek();
if(!path.isEmpty() && path.peek() == root){ which means we hit t
res.add(root.val);
path.pop();
s.pop();
} else {
path.push(root);
if(root.right != null)
s.push(root.right);
if(root.left != null)
s.push(root.left);
s.push(root.right);
if(root.left != null)
s.push(root.left);
}
}
return res;
}
这里每次当path.peek != root的时候,需要path.push(root)记录我们是怎么到当前这一步的。
然后还需要往s.push一个root.right和root.left以便继续遍历。
When top elements of both stacks are equal. (Which means we hit a deadend, and need to turn back)
Pop
fromboth
stacks.
0 0
- 三序遍历以及Vertical Order
- LeetCode 314. Binary Tree Vertical Order Traversal(二叉树垂直遍历)
- Binary Tree Vertical Order Traversal
- Binary Tree Vertical Order Traversal
- Binary Tree Vertical Order Traversal
- Binary Tree Vertical Order Traversal
- Binary Tree Vertical Order Traversal
- Binary Tree Vertical Order Traversal
- 建树以及三种遍历
- Print A Tree In Vertical Order
- [LeetCode314]Binary Tree Vertical Order Traversal
- Leetcode 314 Binary Tree Vertical Order Traversa
- Leetcode Binary Tree Vertical Order Traversal
- [Leetcode]Binary Tree Vertical Order Traversal
- LeetCode. 314 Binary Tree Vertical Order Traversal
- LeetCode 314. Binary Tree Vertical Order Traversal
- Leetcode 314. Binary Tree Vertical Order Traversal
- 314.Binary Tree Vertical Order Traversal
- 写给准备开始作死的自己 :书签记录
- Cockroach Design 翻译 ( 十) 自修复、重平衡
- C#工厂模式-从简单到优雅的几种实践
- android某包的功能突然用不了
- Cockroach Design 翻译 ( 十一) range元数据
- 三序遍历以及Vertical Order
- Cockroach Design 翻译 ( 十二) Raft – Range副本一致性
- writeup-web
- JavaSE学习(4)流程控制
- 微信支付之web篇
- Codeforces Round #382 (Div. 1) A. Tennis Championship(递推)
- SAP HANA Studio使用insufficient privilege 问题
- 关于异常处理的部分总结
- 03-树1 树的同构 (25分)