|
2 | 2 | 1518626557 |
3 | 3 | tags: Stack, Tree, Design, BST |
4 | 4 |
|
| 5 | +Build iterator to print ascending elemnts of BST. Inorder traversal BST. Need to maintain O(1) time, O(h) space. |
| 6 | + |
5 | 7 | 画一下, BST in order traversal. 用stack记录最小值, 放在top. O(h) space. |
6 | 8 | 每次消耗TreeNode, 都看看rightNode(其实就是下一个最小的candidate), 并且一条龙stack叠上rightNode所有的left子孙. |
7 | 9 |
|
8 | | -Previous Notes: |
9 | | -用O(h)空间的做法: |
10 | | - |
11 | | -理解binary search tree inorder traversal的规律: |
12 | | - 先找left.left.left ....left 到底,这里是加进stack. |
13 | | - 然后考虑parent,然后再right. |
14 | | - |
15 | | -例如这题: |
16 | | - stack里面top,也就是tree最左下角的node先考虑,取名rst. |
17 | | - 其实这个rst拿出来以后, 它也同时是最底层left null的parent,算考虑过了最底层的parent。 |
18 | | - 最后就考虑最底层的parent.right, 也就是rst.right. |
19 | | - |
20 | | -注意: |
21 | | - next()其实有个while loop, 很可能是O(h).题目要求average O(1),所以也是okay的. |
22 | | - |
23 | | - |
24 | | -用O(1)空间的做法:不存stack, 时刻update current为最小值。 |
25 | | - |
26 | | -找下一个最小值,如果current有right child: |
27 | | - 和用stack时的iteration类似,那么再找一遍current.right的left-most child,就是最小值了。 |
28 | | - |
29 | | -如果current没有right child: |
30 | | - 那么就要找current node的右上parent, search in BinarySearchTree from root. |
31 | | - |
32 | | -注意: |
33 | | - 一定要确保找到的parent满足parent.left == current. |
34 | | - 反而言之,如果current是parent的 right child, 那么下一轮就会重新process parent。 |
35 | | - 但是有错:binary search tree里面parent是小于right child的,也就是在之前一步肯定visit过,如此便会死循环。 |
| 10 | +#### Stack |
| 11 | +- 用O(h)空间的做法: |
| 12 | +- 理解binary search tree inorder traversal的规律: |
| 13 | +- 先找left.left.left ....left 到底,这里是加进stack; 然后考虑parent,然后再right. |
| 14 | + |
| 15 | +#### Details 例如这题: |
| 16 | +- stack里面top,也就是tree最左下角的node先考虑,取名rst. |
| 17 | +- 其实这个rst拿出来以后, 它也同时是最底层left null的parent,算考虑过了最底层的parent。 |
| 18 | +- 最后就考虑最底层的parent.right, 也就是rst.right. |
| 19 | +- 注意: next()其实有个while loop, 很可能是O(h).题目要求average O(1),所以也是okay的. |
| 20 | + |
| 21 | + |
| 22 | +#### 用O(1)空间的做法: 不存stack, 时刻update current为最小值。 |
| 23 | +- 找下一个最小值,如果current有right child: 和用stack时的iteration类似,那么再找一遍current.right的left-most child,就是最小值了。 |
| 24 | +- 如果current没有right child: 那么就要找current node的右上parent, search in BinarySearchTree from root. |
| 25 | +- 注意: |
| 26 | +- 一定要确保找到的parent满足parent.left == current. |
| 27 | +- 反而言之,如果current是parent的 right child, 那么下一轮就会重新process parent。 |
| 28 | +- 但是有错:binary search tree里面parent是小于right child的,也就是在之前一步肯定visit过,如此便会死循环。 |
36 | 29 |
|
37 | 30 |
|
38 | 31 | ``` |
|
0 commit comments