1. 程式人生 > >牛客網《劍指Offer》 程式設計 23. 二叉樹的後序遍歷序列

牛客網《劍指Offer》 程式設計 23. 二叉樹的後序遍歷序列

題目描述

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

解題思路

二叉搜尋樹的特點:後序遍歷的時候最後一個數是根節點。前面的數分為兩個部分,本別是左子樹部分和右子樹部分。左子樹不部分的所有數都比根節點小;右子樹部分的所有數都比根節點大。

因此可以這樣判定:

如果該二叉樹空樹,則返回false;

如果不為空,那麼確定根節點為最後一個數。

以該數值為分界,將陣列分成兩個部分,前半部分為左子樹,後半部分為右子樹。(左右子樹都可能為空)

只有當左右子樹都為二叉搜尋樹的時候,該樹才為二叉搜尋樹。所以接下來判斷左右子樹。

左子樹一定為空或者是全都是小於根節點的數,不用逐個比較左子樹中的數值和根節點的數值,直接繼續判斷左子樹是否為二叉搜尋樹。(遞迴)。

首先逐個判斷右子樹中所有數值是否都大於根節點值,如果不是,則右子樹不是二叉搜尋樹;如果是,則繼續判斷右子樹是否是二叉搜尋樹(遞迴)。

最後 當左子樹和右子樹都是二叉搜尋樹的時候,才能夠說明該樹是二叉搜尋樹。

程式碼實現

class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        if(sequence.empty()){return false;}
        int len=sequence.size();
        int root=sequence[len-1];
        int idx=0;
        vector<int> leftTree;
        vector<int> rightTree;
        bool left=true;
        bool right=true;
        while(idx<len-1&&sequence[idx]<root){
            idx++;
        }
        if(idx!=0)//左子樹不為空,則接著判斷是左子樹是否是BST
        {
            //leftTree(sequence,sequence+idx);
            leftTree.insert(leftTree.begin(),sequence.begin(),sequence.begin()+idx);
            left=VerifySquenceOfBST(leftTree);
        }
        if(idx!=len-1){//因為在len-1位置上的元素是根元素
            for(int j=idx;j<len-1;j++){
                if(sequence[j]<root){
                    right=false;
                    break;
                }
            }
            if(right){
            rightTree.insert(rightTree.begin(),sequence.begin()+idx,sequence.begin()+len-1);
            right=VerifySquenceOfBST(rightTree);
            }
            
            
        }
        return left&&right;
    }
};