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.
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.
最简单的,先把整棵树给遍历了,找到所有的值
1 /** 2 * Definition for binary tree 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class BSTIterator { 11 public: 12 13 vector<int> vals; 14 int index; 15 BSTIterator(TreeNode *root) { 16 DFS(root); 17 index=-1; 18 } 19 20 void DFS(TreeNode *root) 21 { 22 23 if(root==NULL) return; 24 25 DFS(root->left); 26 vals.push_back(root->val); 27 DFS(root->right); 28 } 29 30 /** @return whether we have a next smallest number */ 31 bool hasNext() { 32 33 if(index<(int)vals.size()-1) return true; 34 else return false; 35 36 } 37 38 /** @return the next smallest number */ 39 int next() { 40 return vals[++index]; 41 } 42 }; 43 44 /** 45 * Your BSTIterator will be called like this: 46 * BSTIterator i = BSTIterator(root); 47 * while (i.hasNext()) cout << i.next(); 48 */
运用二叉排序树的性质
首先连同root把所有左边节点都push到堆栈中,
然后每当调用next时,返回堆栈栈顶元素,然后把栈顶元素的右孩子,以及他的所有左子树都压入栈即可
1 /** 2 * Definition for binary tree 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class BSTIterator { 11 public: 12 13 stack<TreeNode*> stk; 14 BSTIterator(TreeNode *root) { 15 pushLeftNode(root); 16 17 } 18 19 void pushLeftNode(TreeNode *root) 20 { 21 22 while(root!=NULL) 23 { 24 stk.push(root); 25 root=root->left; 26 } 27 } 28 29 30 31 /** @return whether we have a next smallest number */ 32 bool hasNext() { 33 34 return !stk.empty(); 35 } 36 37 /** @return the next smallest number */ 38 int next() { 39 40 TreeNode * smallestNode=stk.top(); 41 stk.pop(); 42 pushLeftNode(smallestNode->right); 43 return smallestNode->val; 44 } 45 }; 46 47 /** 48 * Your BSTIterator will be called like this: 49 * BSTIterator i = BSTIterator(root); 50 * while (i.hasNext()) cout << i.next(); 51 */