[LeetCode] Binary Search Tree Iterator, leetcodeiterator
Binary Search Tree Iterator
Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the root node of a BST.
Callingnext()
Will return the next smallest number in the BST.
Note:next()
AndhasNext()
Shocould run in average O (1) time and uses O (h) memory, where h is the height of the tree.
Solution:
The stack technology is used to bring the leftmost path that is not currently accessed to the stack. Each time the value is set, the top element of the stack pops up, add the leftmost path of the right subtree of the top element of the stack to the stack. HasNext () only needs to check whether the stack is empty. But there is a problem, it seems that the time complexity of the next () function is not O (1), because we want to maintain the stack, so it is O (nlgn ). I don't know if there are any better methods. I also made a small mistake: stack <TreeNode *> stack. You cannot name it stack.
/** * 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) { pushLeftChildIntoStack(root); } /** @return whether we have a next smallest number */ bool hasNext() { return !s.empty(); } /** @return the next smallest number */ int next() { TreeNode* node=s.top(); s.pop(); pushLeftChildIntoStack(node->right); return node->val; }private: stack<TreeNode*> s; void pushLeftChildIntoStack(TreeNode* node){ while(node!=NULL){ s.push(node); node=node->left; } }};/** * Your BSTIterator will be called like this: * BSTIterator i = BSTIterator(root); * while (i.hasNext()) cout << i.next(); */