二叉搜索树的后序遍历序列

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
 
解题思路:
所给序列是二叉搜索树的后续遍历,其实就可以确定树的形态了,因为比根节点大的都是右子树节点,比根节点小的都是左子树节点,但是满足一个重要性质:左子树的子节点的最大值需要比根节点小,右子树的子节点最小值需要比根节点大。需要判断祖父节点跟当前节点的大小关系。
class Solution {
public:
    bool MyVerify(vector<int>seq, int p, int pp, int l, int r){
        if(r < l){
            return true;
        }
        int i;
        for(i=l; i <= r; i++){
            if(pp > p){
                //left
                //max(v) < pp
                if(seq[i] > pp){
                    return false;
                }
            }else{
                //right
                //min(v) > pp
                if(seq[i] < pp){
                    return false;
                }
            }
        }
        for(i=l; i <= r; i++){
            if(seq[i] > p){
                break;
            }
        }
        bool lres = true;
        if(i-2 >= l){
            lres = MyVerify(seq, seq[i-1], p, l, i-2);
        }
        bool rres = true;
        if(r-1 >= i){
            rres = MyVerify(seq, seq[r], p, i, r-1);
        }
        if(lres && rres){
            return true;
        }else{
            return false;
        }
    }
    bool VerifySquenceOfBST(vector<int> sequence) {
        int l = 0;
        int n = sequence.size();
        for(int i=0; i < n-1; i++){
            if(sequence[i] > sequence[n-1]){
                l = i;
                break;
            }
        }
        bool lres = true;
        if(l-1 >= 0){
            lres = MyVerify(sequence, sequence[l-1], sequence[n-1], 0, l-2);
        }
        bool rres = true;
        if(l <= n-2){
            rres = MyVerify(sequence, sequence[n-2], sequence[n-1], l, n-3);
        }
        if (lres && rres){
            return true;
        }else{
            return false;
        }
    }
};

  

posted @ 2019-04-05 17:28  tcgoshawk  阅读(163)  评论(0编辑  收藏  举报