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.
基本思路:用栈来维护当年路径,使的寻找next元素需要回溯父结点变得容易
满足题目对时间复杂度的要求
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class BSTIterator {
private:
TreeNode* _root;
stack<TreeNode*>_curPath;
public:
BSTIterator(TreeNode* root){
_root = root;
for(TreeNode* t = root;t;t = t->left){
_curPath.push(t);
}
}
/** @return whether we have a next smallest number */
bool hasNext() {
return !_curPath.empty();
}
/** @return the next smallest number */
int next() {
TreeNode* t = _curPath.top();_curPath.pop();
for(TreeNode* cur = t->right;cur;cur = cur->left)
_curPath.push(cur);
return t->val;
}
};
/**
* Your BSTIterator will be called like this:
* BSTIterator i = BSTIterator(root);
* while (i.hasNext()) cout << i.next();
*/