Sunday, January 4, 2015

173. Binary Search Tree Iterator ---M

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.

 

    Example:

    BSTIterator iterator = new BSTIterator(root);
    iterator.next();    // return 3
    iterator.next();    // return 7
    iterator.hasNext(); // return true
    iterator.next();    // return 9
    iterator.hasNext(); // return true
    iterator.next();    // return 15
    iterator.hasNext(); // return true
    iterator.next();    // return 20
    iterator.hasNext(); // return false
    

     

    Note:

    • next() and hasNext() should run in average O(1) time and uses O(h) memory, where h is the height of the tree.
    • You may assume that next() call will always be valid, that is, there will be at least a next smallest number in the BST when next() is called.
    A:

    就是简单的用stack来记录当前的path.
    思想跟iterative in-order traversal类似。   但这里,多了一个性质,就是该树是BST (但是题目里面没有用到)。
    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
     *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
     *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
     * };
     */
    class BSTIterator {
    public:
        BSTIterator(TreeNode* root) {
            TreeNode* ptr = root;
            while(ptr){
                myStack.push(ptr);
                ptr= ptr->left;
            }
        }
        
        /** @return the next smallest number */
        int next() {
            auto res = myStack.top();
            myStack.pop();
            TreeNode * ptr = res->right;
            while(ptr){
                myStack.push(ptr);
                ptr= ptr->left;
            }
            return res->val;
        }
        
        /** @return whether we have a next smallest number */
        bool hasNext() {
            return not myStack.empty();
        }
    private:
        stack<TreeNode*> myStack;
    };
    
    /**
     * Your BSTIterator object will be instantiated and called as such:
     * BSTIterator* obj = new BSTIterator(root);
     * int param_1 = obj->next();
     * bool param_2 = obj->hasNext();
     */

    Mistakes:
    1:  恩,错误是  致命的。
            TreeNode* ptr = root;
            while(ptr){
                myStack.push(ptr);
                ptr= ptr->left;
            }
       我写成了 
            TreeNode* ptr = root;
            while(ptr){
                myStack.push(ptr);
                if(ptr->left)
                    ptr= ptr->left;
            }
    造成了死循环






    No comments:

    Post a Comment