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.
Example:
BSTIterator iterator = new BSTIterator(root); iterator.next(); // return 3 iterator.next(); // return 7 iterator.hasNext(); // return true iterator.next(); // return 9 iterator.hasNext(); // return true iterator.next(); // return 15 iterator.hasNext(); // return true iterator.next(); // return 20 iterator.hasNext(); // return false
Note:
next()
andhasNext()
should run in average O(1) time and uses O(h) memory, where h is the height of the tree.- You may assume that
next()
call will always be valid, that is, there will be at least a next smallest number in the BST whennext()
is called.
就是简单的用stack来记录当前的path.
思想跟iterative in-order traversal类似。 但这里,多了一个性质,就是该树是BST (但是题目里面没有用到)。
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ class BSTIterator { public: BSTIterator(TreeNode* root) { TreeNode* ptr = root; while(ptr){ myStack.push(ptr); ptr= ptr->left; } } /** @return the next smallest number */ int next() { auto res = myStack.top(); myStack.pop(); TreeNode * ptr = res->right; while(ptr){ myStack.push(ptr); ptr= ptr->left; } return res->val; } /** @return whether we have a next smallest number */ bool hasNext() { return not myStack.empty(); } private: stack<TreeNode*> myStack; }; /** * Your BSTIterator object will be instantiated and called as such: * BSTIterator* obj = new BSTIterator(root); * int param_1 = obj->next(); * bool param_2 = obj->hasNext(); */
Mistakes:
1: 恩,错误是 致命的。
TreeNode* ptr = root;
while(ptr){
myStack.push(ptr);
ptr= ptr->left;
}
我写成了 TreeNode* ptr = root;
while(ptr){
myStack.push(ptr);
if(ptr->left) ptr= ptr->left; }造成了死循环