【剑指offer23 二叉搜索树的后序遍历序列】

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
 
二叉搜索树,中序遍历的最后一个元素是中间值,找到前一半比它小的,后一半比他大。
如果不满足一半小一半大,就false
满足就递归左右部分
 
class Solution {
public:
    
    bool judge(vector<int>& a, int l, int r){
        if(l >= r) return true;
        int i = r;
        while(i > l && a[i - 1] > a[r]) --i;//到达分界点的比头大的元素
        for(int j = i - 1; j >= l; --j) if(a[j] > a[r]) return false;
        return judge(a, l, i - 1) && (judge(a, i, r - 1));
    }
    
    bool VerifySquenceOfBST(vector<int> sequence) {
        if(!sequence.size()) return false;
        return judge(sequence, 0, sequence.size() - 1);
        
        
        
        /* CLion能过 但是 这上面过不了
        //return false;
        if(sequence.empty())return false;
        int len = sequence.size();
        if(len<=2)return true;
        
        int tou = sequence[len-1]; // 此时二叉树的头
        int flag = 0; //在某个位置前面 都应该比tou小  后面的都比头大
        int flag_i ;
        for(int i=0 ; i<len-1 ; ++i){
            if(sequence[i]<tou)flag_i=i;//会到最后一个比tou小的地方
            if(sequence[i]>tou)flag=1;//只要出现了比头大的  后面就应该都要大
            if(flag == 1 && sequence[i]<tou)return false;//后面出现比头小的了
        }
        vector<int> sequence_front , sequence_back;
        for(int i=0 ; i <=flag_i ; ++i)sequence_front.push_back(sequence[i]);
        for(int i=flag_i+1 ; i <len-1 ; ++i)sequence_back.push_back(sequence[i]);
        return VerifySquenceOfBST(sequence_front) && VerifySquenceOfBST(sequence_back);
        */
    }
};
原文地址:https://www.cnblogs.com/Stephen-Jixing/p/13129475.html