劍指Offer- 23 - 二叉搜索樹的後序遍歷序列 - C++/Java

題目描述

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

解題思路

後序遍歷:左——右——根 ,且 左 < 根 < 右
突破口:後序遍歷到的最後一個結點就是根節點,之前遍歷到的結點小於根結點則爲左子樹,大於根節點則爲右子樹

思路:
1、確定root;
2、遍歷序列(除去root結點),找到第一個大於root的位置,則該位置左邊爲左子樹,右邊爲右子樹;
3、遍歷右子樹,若發現有小於root的值,則直接返回false;
4、分別判斷左子樹和右子樹是否仍是二叉搜索樹(即遞歸步驟1、2、3)。

具體代碼

• C++

public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        if(!sequence.size())
            return false;
        return judge(sequence,0,sequence.size()-1);
    }
    
    // 判斷是否爲二叉排序樹
    // start表示數組起始位,end表示數組終點位
    bool judge(vector<int> &sequence, int start, int end){
        if(start >= end)
            return true;
        
        int pivot; //第一個大於根節點的位置
        for(pivot = start; sequence[pivot] < sequence[end]; pivot ++); //查找分界點
        for(int i = pivot; i<=end; i++)
            // 若該分界點的右邊有小於根結點的數,false
            if(sequence[i] < sequence[end])
                return false;
        return judge(sequence,start,pivot-1) && judge(sequence,pivot,end-1);
                
    }
};

• Java

public class Solution {
    public boolean VerifySquenceOfBST(int [] sequence) {
        if(sequence.length <= 0)
            return false;
        return judge(sequence,0,sequence.length-1);
    }
    
    public boolean judge(int [] sequence,int start,int end){
        if(start>=end)
            return true;
        
        int pivot;
        for(pivot = start; sequence[pivot] < sequence[end]; pivot++); //查找分界點
        for(int i = pivot; i <= end; i++)
            if(sequence[i] < sequence[end])
                return false;
        return judge(sequence,start,pivot-1) && judge(sequence,pivot,end-1);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章