20、二叉搜索树的后续遍历序列

题目:

输入一个整数数组,判断该数组是否为某二叉树的后续遍历结果,如果是输出true,否为false。假设输入中任意两个数字都不相同。例如 5,7,6,9,11,10,8 可以为一个后续遍历结果。其中5,7,6,为左子树,9,11,10为右子树,8为根

解法:

1、二叉搜索树后续遍历序列:(左)(右)根,且左<根<右。序列中的数字大小关系如左边所示。

2、利用循环法。

3、利用递归法。

(一)循环代码如下:

    从后向前依次确认 每一个点是否满足 二叉搜索树在后续遍历中的大小关系。

    例如题目案例中,第一次8为根,5,7,6为左数,9,11,10为右树,满足情况。

    第二次循环中,根为10.即右子树的根。右子树的根>根>左子树。所以5,7,6仍然满足。又在右子树中存在(左=9)<(根=10)<(右=11) 的情况,且数字9紧跟在5,7,6后面。所以该逻辑正确。  每一次循环结束后,让i归零。

    bool VerifySquenceOfBST(vector<int> sequence) {
        if(sequence.empty()||sequence.size()==0)
            return false;
        int i=0;
        int n =sequence.size();
        while(--n)
        {
            while(sequence[i]<sequence[n]) i++;
            while(sequence[i]>sequence[n]) i++;
            if(n!=i)
                return false;
            else
                i=0;
        }
        return true;

(二)递归代码如下:

1、先确认左子树所有点小于根节点

2、再确认右子树所有点大于根节点

3、依次求得左右子树进行递归

    bool VerifySquenceOfBST(vector<int> sequence) {
        if(sequence.empty()||sequence.size()==0)
            return false;
        int i=0,j;
        int n =sequence.size();
        int root = sequence[n-1];
        for(;i<n-1;i++)
        {
            if(sequence[i]>root) 
                break;
        }
        for(j=i;j<n-1;j++)
        {
            if(sequence[j]<root)
                return false;
        }
        vector<int> left,right;
        for(j=0;j<i;j++)
            left.push_back(sequence[j]);
        for(j=i;j<n-1;j++)
            right.push_back(sequence[j]);
        bool l=true,r=true;//注意此处要 初始化为true,因为如果下面两个if没有进行,即子树为空树。相当于只有根节点,肯定为true。
        if(left.size()>1) l=VerifySquenceOfBST(left);// 因为要运行此处的代码,在第一层递归中就已经判断整棵树不为空了。
        if(right.size()>1) r=VerifySquenceOfBST(right);//也即仅在第一层递归中设置空树为false,其他层递归都是true
        return l&&r;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值