剑指offer 二叉搜索树的后序遍历 C++

根据给定的整数数组判断是否为二叉搜索树的后序遍历结果。后序遍历顺序为左子树、右子树、根节点。在二叉搜索树中,左子树所有节点小于根节点,右子树所有节点大于根节点。通过递归或迭代方式,检查数组中每个元素是否满足此条件。
摘要由CSDN通过智能技术生成

题目:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。

如果是则返回true,否则返回false。

假设输入的数组的任意两个数字都互不相同。

样例
输入:[4, 8, 6, 12, 16, 14, 10]

输出:true
做题思路:
首先问的是后序遍历结果,那么我们要知道什么是后序遍历 左右根 ,故而,序列最后一个肯定是根节点。
其次 二叉搜索树 ,也就是左子树均小于根节点,右子树的结点均大于根节点。
最后这肯定是bool 判断才有true false.

class Solution {
public:
    vector<int> seq;    //设定一个全局变量seq,方便后面使用
    bool verifySequenceOfBST(vector<int> sequence) {
        seq = sequence ;
        return dfs(0,seq.size() -1);//最开始左右边界;
    }
    bool dfs(int l , int r )
    {
        if(l>=r) return true;//如果左大于根,为空 或者只有一个根节点,合法
        int root = seq[r];//此时根节点便是序列最右侧,因为后序遍历是左右根,最后一个肯定是根节点。
        int k = l;
        //下面遍历出左子树,只要是K比最右侧小,结点的数值也小于根节点,那么K累加,循环出来的就是左子树
        while(k < r && seq[k] < root) k++;
        //下面看看右子树是否合法,也就是右子树里面的数值是不是有比根节点小,如果有就是false非法也~
        for(int i=k ;i<r;i++)
            if(seq[i]<root)
               return false;
        return dfs(l,k-1) && dfs(k,r-1);//特别注意:最后是返回的左右子树的边界,这个范围一定不能错,特别是右子树是从K到R-1,没有r,因为r是根节点啊。

    }       

};
        

特别提醒:这个K,一定要注意,最后他到底是左子树的还是右子树的要清楚,清楚while循环累加后的K
举例子:
在这里插入图片描述
while 的判断中如果a 为4 ,也会继续执行 a++,那么出来的就是下一个,所以,k 出来的就是右子树第一个。所以,最后dfs 右子树的范围为(k,r-1)。如何这个范围错了,你真的会疯的的~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值