剑指offer-二叉搜索树的后序遍历序列(C++ 递归)

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

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

题解:
对于此题,我们首先要了解的是二叉搜索树的结构,即什么是二叉搜索树。同时,了解后序遍历的遍历顺序。
二叉搜索树(二叉查找树、二叉排序树):其或为一个空树,或是具有以下性质的二叉树——若它的左子树不空,则左子树上的所有节点的值均小于根节点的值;若它的右子树不空,则右子树上的所有节点的值均大于根节点的值。同时,其左右子树也是二叉搜索树。
后序遍历:遍历顺序为 左节点->右节点->根节点

因此可以得到,二叉搜索树的后序遍历的特点:后序遍历的最后一个数即为二叉搜索树的根节点;小于根节点的值的节点位于左子树,大于根节点的值的节点位于右子树。
从根节点到叶节点通过递归的方法来进行测试,若满足条件,则该序列为某二叉搜索树的后序遍历,若不满足,则不是。

注意虽然在题目中说明数组非空,但是在测试过程中,还是出现了空数组。

代码如下:

class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence,int status=0) {
        int num=sequence.size();
        int le=0,ri=0;
        if(status==0&&num==0)//status用于判定第一次输入的数组是否是空数组
            return false;
        if(num==0||num==1)//判定只有一个数的数组,满足条件
            return true;
        while(sequence[ri]<sequence[num-1])//获得左右子树的分界点
            ri++;
        vector<int> left;
        vector<int> right;
        for(int i=0;i<num-1;i++){
            if(i<ri){
                if(sequence[i]<sequence[num-1])//在分界点左侧的数据均小于根节点,若不是,则代表序列不是二叉搜索树的后序遍历
                    left.push_back(sequence[i]);
                else
                    return false;
            }
            else{//根节点右侧的数据均大于根节点,若不是,则直接返回false
                if(sequence[i]>sequence[num-1])
                    right.push_back(sequence[i]);
                else
                    return false;
            }
        }
        //递归进行根节点的左右子树,递归判定。只有全部满足,才会返回true
        return VerifySquenceOfBST(left,1)&&VerifySquenceOfBST(right,1);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值