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.
分析:
感觉蛮简单的!就是一个中序遍历嘛!可能想的太简单了!
next()和hasnext()函数的空间复杂度为O(1),时间复杂度为O(1),这里并没有符合要求。
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class BSTIterator {
public:
BSTIterator(TreeNode *root) {
inorderTraversal(root);//获取中序遍历结果
pos=0;
}
void inorderTraversal(TreeNode* root) {
if(root){
inorderTraversal(root->left);
result.push_back(root->val);
inorderTraversal(root->right);
}
}
/** @return whether we have a next smallest number */
bool hasNext() {
return pos < result.size();
}
/** @return the next smallest number */
int next() {
return result[pos++];
}
private:
vector<int> result;
int pos;
};
/**
* Your BSTIterator will be called like this:
* BSTIterator i = BSTIterator(root);
* while (i.hasNext()) cout << i.next();
*/
别人的算法设计:
class BSTIterator {
public:
BSTIterator(TreeNode *root) {
pushLeft(root);
}
/** @return whether we have a next smallest number */
bool hasNext() {
return !stk.empty();
}
/** @return the next smallest number */
int next() {//空间复杂度为O(h),时间复杂度为O(h)
TreeNode *tmpNode = stk.top();
stk.pop();
pushLeft(tmpNode->right);
return tmpNode->val;
}
void pushLeft(TreeNode *node) {//空间复杂度为O(h),时间复杂度为O(h)
while (node != NULL)
{
stk.push(node);
node = node->left;
}
}
private:
stack<TreeNode *> stk;
};
注:本博文为EbowTang原创,后续可能继续更新本文。如果转载,请务必复制本条信息!
原文地址:http://blog.csdn.net/ebowtang/article/details/51660101
原作者博客:http://blog.csdn.net/ebowtang
本博客LeetCode题解索引:http://blog.csdn.net/ebowtang/article/details/50668895