二叉搜索树的后序遍历序列:递归中不要过早return f(左)&&f(右)

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
1.我是想把判断大小(递归终止)留到start>end,这题不用深度递归到叶节点,可以第一遍遍历就判断根节点的左右是否满足f(左)<根<f(右),不要过早就递归了,start>end这个递归条件用习惯了,以后要改。

2.这道题恰恰不能(递归终止)留到start>end,因为满足当前某个子树满足“性质”,但是它可能不满足 “父节点”的性质。
【7 4 6 5】 
5 ---(7)(46) 在“单独”判断(46)两个节点时,已经不在乎他是否跟5有什么关系了。

总结:递归中不要过早return f(左)&&f(右) ,一般情况没有这么完备,还要分段考虑,这题左子树可能为空,右子树也可能为空,所以不要一想到二叉树递归就是 return f(左)&&f(右)

class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        if(sequence.empty()) return false;
        return isSquenceOfBST(sequence,0,sequence.size()-1);
    }
    bool isSquenceOfBST(vector<int>&sequence,int start,int end){

        int i=start;
        for (; i < end; ++i)
        {
            if(sequence[i]>sequence[end]) break; 
        }
        int j=i;
        for (; j < end; ++j)
        {
            if(sequence[j]<sequence[end]) return false;
        }
        bool left=true;
        if(i>start) //举例,如果是[10,7,5],左子树为空,所以左边返回true
            left=isSquenceOfBST(sequence,start,i-1);
        bool right=true;
        if(i<end) //举例,如果是[1,2,3,4],右子树为空,所以右边返回true
            right=isSquenceOfBST(sequence,i,end-1);

        return left&&right;

    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值