【劍指Offer】面試題24:二叉搜索樹的後續遍歷序列

整理自劍指Offer


一:題目描述

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


二:解題思路

二叉搜索樹:

1.是二叉樹

2.是符合一定規則的二叉樹   左子結點的值小於根節點的值,右子結點的值大於根節點的值


後續遍歷的結果{5,7,6,9,11,10,8}


最後一個數字是根節點的值。數組中前面的數字可以分爲兩部分。

第一部分是左子樹結點的值,他們都比根節點的值小

第二部分是右子樹結點的值,他們都比根節點的值大


{5,7,6,9,11,10,8}

最後一個根節點的值8,左子樹{5,7,6},右子樹{9,11,10}

遞歸的分析左右子樹

根節點爲6,左子樹{5},右子樹{7}

根節點爲10,左子樹{9},右子樹{11}

三:代碼實現

class Solution {
public:
    
    bool VerifySquenceOfBSTCore(vector<int> sequence,int start,int end){
        
        //start>end:只有右子樹或只有左子樹
        if(start==end || start>end)
            return true;
        
        int root=sequence[end];
        int i; //尋找左子樹的終止位置i-1
        //二叉搜索樹中左子樹的結點小於根節點
        for(i=start;i<end;i++)
            if(sequence[i]>root)
                break;
        int j=i;  
        //二叉搜索中右子樹的結點大於根節點,如果小於,則說明該序列不是二叉搜索樹的後續遍歷的結果
        for(;j<end;j++)
            if(sequence[j]<root)
                return false;
        
        //左子樹[start,i-1]  右子樹[i,end-1]
        //判斷左子樹是不是二叉搜索樹
         bool left=VerifySquenceOfBSTCore(sequence,start,i-1);
        //判斷右子樹是不是二叉搜索樹
         bool right=VerifySquenceOfBSTCore(sequence,i,end-1);
        
         return left&&right;
    }
    
    
    bool VerifySquenceOfBST(vector<int> sequence) {
		
        if(sequence.size()==0)
            return false;
        
        if(sequence.size()==1)
            return true;
        
        int start=0; //序列的起始位置
        int end=sequence.size()-1;  //序列的終止位置
        
        return VerifySquenceOfBSTCore(sequence,start,end);
        
    }
};

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