173 Binary Search Tree Iterator
Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the root node of a BST.
Calling next()
will return the next smallest number in the BST.
Example:
BSTIterator iterator = new BSTIterator(root);
iterator.next(); // return 3
iterator.next(); // return 7
iterator.hasNext(); // return true
iterator.next(); // return 9
iterator.hasNext(); // return true
iterator.next(); // return 15
iterator.hasNext(); // return true
iterator.next(); // return 20
iterator.hasNext(); // return false
Note:
next()
andhasNext()
should run in average O(1) time and uses O(h) memory, where h is the height of the tree.- You may assume that
next()
call will always be valid, that is, there will be at least a next smallest number in the BST whennext()
is called.
题目大意
构造二叉排序树,实现next和hasnext函数,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;
* }
* }
*/
class BSTIterator {
Stack<TreeNode> ans;
public BSTIterator(TreeNode root) {
this.ans = new Stack<TreeNode>();
this.leftmosttravel(root);
}
public void leftmosttravel(TreeNode root){
while(root != null){
this.ans.push(root);
root = root.left;
}
}
/** @return the next smallest number */
public int next() {
TreeNode t = this.ans.pop();
if(t.right != null){
this.leftmosttravel(t.right);
}
return t.val;
}
/** @return whether we have a next smallest number */
public boolean hasNext() {
return this.ans.size() > 0;
}
}
/**
* 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();
*/