二叉树的后序遍历序列

题目描述:

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

例如5 7 6 9 11 10 8是二叉树

           8

        /      \

     6         10

  /      \     /       \

 5      7   9       11

的后序遍历序列

而 7 4 5 6则不是,因为以6位根节点,7 4 5是右子树,但是出现了4<5,所以不是后序遍历序列

常规思路:判断右子树中是都有小于根节点的,用递归的方法再判断划分的左右子树

代码:

class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        bool re=1;
        if(sequence.size()==0)
            return 0;
        recurBST(sequence,0,sequence.size()-1,re);
        return re;
         
    }
    void recurBST(vector<int> sequence,int start,int end,bool& re){
        if(start==end)
            return;
        int i=0;
        while(i<end&&sequence[i]<sequence[end])
            i++; 
        //如果有右子树,判断,不满足则递归遍历 
        if(i<end){
            for(int j=i+1;j<=end-1;j++){
                if(sequence[j]<sequence[end]){
                    re=0;
                    return;
                }         
            }
            recurBST(sequence,i,end-1,re);
        }
        if(i!=start)//如果有左子树,遍历
            recurBST(sequence,start,i-1,re);   
    }
};
另外用非递归的方法也可以,代码非常简洁,从右边开始,分别将每个结点作为根节点,再遍历前面的元素

class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        int size=sequence.size();
        if(0==size)
            return 0;
        int i=0;
        while(--size){
            while(sequence[i]<sequence[size]) i++;
            while(sequence[i]>sequence[size]) i++;
            if(i<size)
                return 0;
            i=0;
        }
        return 1;
    }
};

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值