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, whereh is the height of the tree.
I first misunderstood this question. I thought when given a nodes, next() should output the next in-order successor.
This one is in-order traverse, but to print one by one by calling next function.... This is a variation of in-order traversal of binary tree.
class BSTIterator {
private:
stack<TreeNode*> nodes;
public:
BSTIterator(TreeNode *root) {
while(root) {
nodes.push(root);
root = root->left;
}
}
/** @return whether we have a next smallest number */
bool hasNext() {
return !nodes.empty();
}
/** @return the next smallest number */
int next() {
TreeNode* node = nodes.top();
int val = node->val;
nodes.pop();
node = node->right;
while(node) {
nodes.push(node);
node = node->left;
}
return val;
}
};
Another variation of this question : given a target node in binary tree, get the next node in binary tree in-order order.
// binary tree inorder iterator
struct TreeNode {
TreeNode* left;
TreeNode* right;
TreeNode* parent;
}
// get the nextOne in in-order traversal order.
TreeNode* getNode(TreeNode* current) {
if(current->right != NULL) {
return inorderTraversal(current->right);
} else {
if(current->parent->left == current) return current->parent;
else {
TreeNode* tmp = current;
TreeNode* next = tmp->parent;
while(next && next->left != tmp) {
tmp = next;
next = next->parent;
}
return next;
}
}
}