1. 程式人生 > >劍指offer--二叉搜尋樹的後序遍歷序列

劍指offer--二叉搜尋樹的後序遍歷序列

題目描述

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

解析

每次判斷一個結點的左右子樹是否左邊全小於結點,右邊全大於結點,然後遞迴判斷兩個子節點的情況。

每次選擇的節點都是後序遍歷的最後一個結點,也就是根節點。

class Solution {
public:
    void method(vector<int> sequence, bool& flag){
        int length = sequence.size();
        if(length==0 || length==1)return;
        int temp = sequence[length-1];
        int f = 0,leftlength =  -1;
        for(int i=0;i<length-1;i++){
            if(sequence[i]>temp && f==0){
                leftlength = i;
                f = 1;
            }
            if(f==1 && sequence[i]<temp){
                flag = false;
                return;
            }
        }
        vector<int> left,right;
        if(leftlength==-1){//無右子樹
            left.assign(sequence.begin(),sequence.end()-1);
            method(left, flag);
        }else if(leftlength==0){//無左子樹
            right.assign(sequence.begin(),sequence.end()-1);
            method(right, flag);
        }else{
            left.assign(sequence.begin(), sequence.begin()+leftlength);
            right.assign(sequence.begin()+leftlength+1, sequence.end()-1);
            method(left, flag);
            method(right, flag);
        }
    }

    bool VerifySquenceOfBST(vector<int> sequence) {
        if(sequence.size()==0)return false;
        bool result = true;
        method(sequence, result);
        return result;
    }
};