【leetcode】Binary Search Tree Iterator

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  */

 

 

posted @ 2015-01-01 16:40  H5开发技术  阅读(180)  评论(0编辑  收藏  举报