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;
}
}
};

本文介绍了一种针对二叉搜索树(BST)的迭代器实现方法,该迭代器能够高效地找到树中的下一个最小值,并判断是否还有更多元素可供迭代。通过使用栈进行中序遍历,该方法平均时间复杂度为O(1),空间复杂度为O(h),其中h为树的高度。

284

被折叠的 条评论
为什么被折叠?



