173. Binary Search Tree Iterator

Total Accepted: 50775  Total Submissions: 144066  Difficulty: Medium

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.

Credits:
Special thanks to @ts for adding this problem and creating all test cases.

Subscribe to see which companies asked this question

Hide Tags
  Tree Stack Design
Hide Similar Problems
  (M) Binary Tree Inorder Traversal (M) Flatten 2D Vector (M) Zigzag Iterator (M) Peeking Iterator (M) Inorder Successor in BST

分析:

感觉蛮简单的!就是一个中序遍历嘛!可能想的太简单了!

next()和hasnext()函数的空间复杂度为O(1),时间复杂度为O(1),这里并没有符合要求。

/**
 * 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) {
        inorderTraversal(root);//获取中序遍历结果
        pos=0;
    }
    void inorderTraversal(TreeNode* root) { 
         if(root){      
            inorderTraversal(root->left);      
            result.push_back(root->val);      
            inorderTraversal(root->right);      
        }      
    }      
    /** @return whether we have a next smallest number */
    bool hasNext() {
        return pos < result.size();
    }

    /** @return the next smallest number */
    int next() {
        return result[pos++];
    }
private:      
    vector<int> result;
    int pos;
};

/**
 * Your BSTIterator will be called like this:
 * BSTIterator i = BSTIterator(root);
 * while (i.hasNext()) cout << i.next();
 */


别人的算法设计:

class BSTIterator {
    
public:
    BSTIterator(TreeNode *root) {
        pushLeft(root);
    }

    /** @return whether we have a next smallest number */
    bool hasNext() {
        return !stk.empty();
    }

    /** @return the next smallest number */
    int next() {//空间复杂度为O(h),时间复杂度为O(h)
        TreeNode *tmpNode = stk.top();
        stk.pop();
        pushLeft(tmpNode->right);
        return tmpNode->val;
    }
    
    void pushLeft(TreeNode *node) {//空间复杂度为O(h),时间复杂度为O(h)
        while (node != NULL)
        {
            stk.push(node);
            node = node->left;
        }
    }
    
private:
    stack<TreeNode *> stk;
};



注:本博文为EbowTang原创,后续可能继续更新本文。如果转载,请务必复制本条信息!

原文地址:http://blog.csdn.net/ebowtang/article/details/51660101

原作者博客:http://blog.csdn.net/ebowtang

本博客LeetCode题解索引:http://blog.csdn.net/ebowtang/article/details/50668895

你可能感兴趣的:(LeetCode,C++,算法,面试,遍历)