zoukankan      html  css  js  c++  java
  • 【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  */
  • 相关阅读:
    二叉树的镜像(剑指offer-18)
    树的子结构(剑指offer-17)
    合并两个有序链表(剑指offer-16)
    OutOfMemory相关问题(内存溢出异常OOM)
    Java内存区域
    招银网络(一面06.29)
    反转链表(剑指offer-15)
    链表中倒数第k个节点(剑指offer-14)
    调整数组顺序使奇数位于偶数前面(剑指offer-13)
    数值的整数次方(剑指offer-12)
  • 原文地址:https://www.cnblogs.com/reachteam/p/4197342.html
Copyright © 2011-2022 走看看