我们知道知道前序和中序就能还原二叉树,知道后序和中序也能还原二叉树。 此题虽然表面只给出了后序遍历序列,但是还给出了一个隐含条件: 此树是一个二叉搜索树,所以我们就知道了其中序遍历序列单调递增,根据其后序序列排个序可得中序序列,然后还原二叉树就行了,还原不了就是false,能还原就是true。

class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        if(sequence.size()==0)return false;
        vector<int > mid = sequence;
        sort(mid.begin(),mid.end());//构造中序遍历序列
        int len=sequence.size();
        int id= len-1;
        return judge(mid, sequence, 0, len, id);
    }
    //根据后序和中序逆遍历二叉树
    bool judge(vector<int> mid,vector<int> sequence,int l,int r,int &id){
        if(l>=r)return true;//此子树为空
        /*
            根据后序序列 定 子树的根
        */
        int i;
        for(i=l;i<r;i++){
            if(mid[i]==sequence[id])break;
        }
        if(i>=r)return false;
        id--;
//         ------------------------------
        //递归划分区间
        bool f1=judge(mid, sequence,i+1, r, id);
        if(f1==false)return false;
        bool f2=judge(mid, sequence,l, i, id);
        return f2;
    }
};