173. 二叉搜索樹迭代器(最詳細的解法!!!)

實現一個二叉搜索樹迭代器。你將使用二叉搜索樹的根節點初始化迭代器。

調用 next() 將返回二叉搜索樹中的下一個最小的數。

示例:

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

提示:

next() 和 hasNext() 操作的時間複雜度是 O(1),並使用 O(h) 內存,其中 h 是樹的高度。
你可以假設 next() 調用總是有效的,也就是說,當調用 next() 時,BST 中至少存在一個下一個最小的數。

解題思路:
根據二叉搜索樹的特性、利用中序遍歷將元素壓入一個容器中、然後依次取出,即可實現。

代碼一:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */

/*class BSTIterator {
public:
    BSTIterator(TreeNode* root) {
        inOrder(root);
    }
    
    /** @return the next smallest number */
  /*  int next() {
        int top = q.front();
        q.pop();
        return top;
    }
    
    /** @return whether we have a next smallest number */
  /*  bool hasNext() {
        return !q.empty();
    }
    void inOrder(TreeNode* node) {
        if (!node) return;
        inOrder(node->left);
        q.push(node->val);
        inOrder(node->right);
    }
private:
    queue<int> q;
    
};*/

代碼二:

/*class BSTIterator {
public:
    BSTIterator(TreeNode* root) {
        inOrder(root);
    }
    
    int next() {
        int top = res.top();
        res.pop();
        return top;
    }

    bool hasNext() {
        return !res.empty();
    }
    void inOrder(TreeNode* node) {
        if (!node) 
            return;
        inOrder(node->right);
        res.push(node->val);
        inOrder(node->left);
    }
private:
    stack<int> res;
    
};*/

代碼三:

class BSTIterator {
public:
    BSTIterator(TreeNode *root) {
        while (root) {
            s.push(root);
            root = root->left;
        }
    }
 
    /** @return whether we have a next smallest number */
    bool hasNext() {
        return !s.empty();
    }
 
    /** @return the next smallest number */
    int next() {
        TreeNode *n = s.top();
        s.pop();
        int res = n->val;
        if (n->right) {
            n = n->right;
            while (n) {
                s.push(n);
                n = n->left;
            }
        }
        return res;
    }
private:
    stack<TreeNode*> s;
};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章