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.
Note: next()
and hasNext()
should run in average O(1) time and uses O(h) memory, where h is the height of the tree.
先实现中序遍历代码。然后改造为迭代器。
public class BSTIterator {
private TreeNode node;
private Stack<TreeNode> stack;
public BSTIterator(TreeNode root) {
node = root;
stack = new Stack<TreeNode>();
while (node != null) {
stack.push(node);
node = node.left;
}
}
/**
* @return whether we have a next smallest number
*/
public boolean hasNext() {
return !stack.empty();
}
/**
* @return the next smallest number
*/
public int next() {
TreeNode t = node = stack.pop();
if (node.right != null) {
node = node.right;
while (node != null) {
stack.push(node);
node = node.left;
}
}
return t.val;
}
public void inOrder(TreeNode root) {
TreeNode node = root;
while (node != null) {
stack.push(node);
node = node.left;
}
while (!stack.empty()) {
System.out.print((node = stack.pop()) + ",");
if (node.right != null) {
node = node.right;
while (node != null) {
stack.push(node);
node = node.left;
}
}
}
}
}