Problem
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.
Example
Given a binary search tree below and its root
4
/ \
2 5
/ \
1 3
with
> BSTIterator i = BSTIterator(root);
> while (i.hasNext()) cout << i.next();
output: 1, 2, 3, 4, 5
Algorithm
整理一下题意:给定一棵二叉搜索树,定义函数next()返回二叉搜索树中下一个最小值,hasnext()函数返回这棵二叉树是否有下一个最小值。
由于二叉搜索树的特点,左子<父<右子,所以利用栈中序遍历整棵树即可。题中拆分的几个函数实际上是将中序遍历的过程拆分成三个阶段(有一个函数需要自己补全)。
代码如下。
class BSTIterator {
public:
BSTIterator(TreeNode *root) {
pushLeft(root);
}
/** @return whether we have a next smallest number */
bool hasNext() {
return !st.empty();
}
/** @return the next smallest number */
int next() {
TreeNode*top=st.top();
st.pop();
pushLeft(top->right);
return top->val;
}
private:
stack<TreeNode*> st;
void pushLeft(TreeNode* root){
while(root!=NULL){
st.push(root);
root=root->left;
}
}
};