173. 二叉搜索树迭代器
题目描述
实现一个二叉搜索树迭代器类BSTIterator
,表示一个按中序遍历二叉搜索树(BST)的迭代器:
BSTIterator(TreeNode root)
初始化BSTIterator
类的一个对象。BST 的根节点root
会作为构造函数的一部分给出。指针应初始化为一个不存在于 BST 中的数字,且该数字小于 BST 中的任何元素。boolean hasNext()
如果向指针右侧遍历存在数字,则返回true
;否则返回false
。int next()
将指针向右移动,然后返回指针处的数字。
注意,指针初始化为一个不存在于 BST 中的数字,所以对 next()
的首次调用将返回 BST 中的最小元素。
你可以假设 next()
调用总是有效的,也就是说,当调用 next()
时,BST 的中序遍历中至少存在一个下一个数字。
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
提示:
- 树中节点的数目在范围 \([1, 10^5]\) 内
- \(0 \le Node.val \le 10^6\)
- 最多调用 \(10^5\) 次
hasNext
和next
操作
思路
栈
- 用栈来模拟 BST 的中序遍历过程,当前结点进栈,代表它的左子树正在被访问。栈顶结点代表当前访问到的结点。
- 求后继时,只需要弹出栈顶结点,取出它的值。然后将它的右儿子以及右儿子的左儿子等一系列结点进栈,这一步代表找右子树中的最左子结点,并记录路径上的所有结点。
- 判断是否还存在后继只需要判断栈是否为空,因为栈顶结点是下一次即将被访问到的结点。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
|