思路
非递归中序遍历二叉树 —> 用栈存储
1) 构造器 —> 将根结点的最左结点都压栈
2) hashNext() —> 等价于判断栈是否为空
3) next()
- 访问结点。
- 处理其右子树的结点。
实现
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
public class BSTIterator {
private Stack<TreeNode> stack = new Stack<>();
public BSTIterator(TreeNode root) {
TreeNode t = root;
while(t != null) {
stack.push(t);
t = t.left;
}
}
public int next() {
TreeNode cur = stack.pop();
int value = cur.val;
cur = cur.right;
// 每次访问完一个node,将其右子树的左边孩子压栈
while (cur != null) {
stack.push(cur);
cur = cur.left;
}
// 返回当前结点值
return value;
}
public boolean hasNext() {
// 等价于,判断栈是否为空
return !stack.isEmpty();
}
}
/**
* Your BSTIterator object will be instantiated and called as such:
* BSTIterator obj = new BSTIterator(root);
* int param_1 = obj.next();
* boolean param_2 = obj.hasNext();
*/