1. 程式人生 > >173. Binary Search Tree Iterator(二叉查詢樹迭代器)的C++解法

173. Binary Search Tree Iterator(二叉查詢樹迭代器)的C++解法

注意是二叉查詢樹,意味著左子樹<根<右子樹,因此,如果沒有特殊要求,只需要中序遍歷樹,將每個結點儲存即可。

但是題目要求空間複雜度為O(h),h是二叉查詢樹的深度,因此考慮每次只放一部分樹的結點入棧。首先我們知道根的左子樹的左子樹的左子樹...一直到最左的左子樹L一定是最小值,那麼先把這部分壓入棧,棧頂元素L就是最小值。而下一個最小值,有可能是這個結點的右子樹(根L->right,或者根的左子樹L->right->.....left),那麼把這部分壓入棧中;如果沒有的話就向上找L->father(樹的結構裡沒有這個值但是棧中已經儲存了)。
圖形解釋可以看這篇部落格。

class BSTIterator {
public:
    stack<TreeNode *> s;
    BSTIterator(TreeNode *root) {
        while(root!=NULL)
       {
           s.push(root);
           root=root->left;
       }
    }
    bool hasNext() {
        if (s.empty()) return false;
        else return true;
    }
    int next() {
        TreeNode * res=s.top();
        s.pop();
        TreeNode * tmp=res->right;
        while (tmp!=NULL)
        {
            s.push(tmp);
            tmp=tmp->left;
        }
        return res->val;
    }
};
  • 還有要求空間複雜度為O(1)的,我想可以參考Morris演算法。Morris演算法主要利用了葉子節點的左右子樹均為空的特性,構建一個從葉子到根的迴路來代替棧。