【劍指Offer】二叉搜索樹的後序遍歷序列詳解

題目描述

輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的數組的任意兩個數字都互不相同。

什麼是二叉搜索樹:

根節點的值大於其左子樹中任意一個節點的值,小於其右節點中任意一節點的值,這一規則適用於二叉查找樹中的每一個節點。
本文章重點來討論一下關於二叉查找樹刪除節點的問題。

二叉搜索樹上的基本操作所花費的時間與這棵樹的高度成正比。對於有n個結點的一棵完全二叉樹來說,這些操作的最壞運行時間爲Θ(lgn)。然而,如果這棵樹是一條n個結點組成的線性鏈,那麼同樣的操作就要花費Θ(n)的最壞運行時間。當然,我們可以通過隨即構造一棵二叉搜索樹的期望高度爲O(nlgn),因此這樣一棵的動態集合的基本操作的平均運行時間是Θ(lgn)。

class Solution {
    bool judge(vector<int>& s,int l,int r){
            if(l>=r)//遍歷完成 說明符合BST定義
                return true;
            int i=r;
            while( i > l&& s[i-1] > s[r])//確定右子樹的範圍 s[r]爲根節點的值
                 i--;
            for(int j=i-1;j>=l;j--)//確定左子樹是否符合BST定義
                if(s[j]>s[r])
                    return false;
            return judge(s,l,i-1)&&judge(s,i,r-1);//遞歸確定左右子樹
    }
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
            int len = sequence.size();
            if(len == 0)//爲空樹
                return false;
            return judge(sequence , 0 , len-1 );//判斷是否爲BST
    }
};

 

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