【剑指**】33.二叉搜索树的后续遍历

本文介绍了一种算法,用于判断给定数组是否为二叉搜索树的后序遍历结果。通过分析根节点及左右子树的特性,实现了一个递归函数进行验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

33.二叉搜索树的后续遍历

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

本题的区别之处在于,不是让你去后序遍历BST,而是给了你序列,让你来判断它是不是由一个BST的后续遍历产生的。这就要求我们对BST 已经后续遍历的特点有所了解。BST 是有序的树,树节点的值大小满足 left < root < right。 而后续遍历的顺序为: left rigth root 。

这意味着:

  • 序列的最后一个节点是整棵树的根节点;
  • 序列前面是left子树所在的序列,且全部小于root节点的值;
  • 其余的序列都是right子树的序列,且全部大于root节点的值;

本题就是依据上面的关系去判断。

代码
class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        if (sequence.empty()) return false;
        int i = 0, j = 0;
        int root_val = sequence[sequence.size() - 1];
        // left 
        for (; i < sequence.size(); i++) {
            if (sequence[i] > root_val) 
                break;
        }
        // right
        for (j = i; j < sequence.size(); j++) {
            if (sequence[j] < root_val)
                return false;
        }

        // left substree
        bool left = true;
        if (i > 0) {
            vector<int> next(sequence.begin(), sequence.begin() + i + 1);
            left = VerifySquenceOfBST(next);
        }
        // right substree
        bool right = true;
        if (j < sequence.size()) {
            vector<int> next(sequence.begin() + i + 1, sequence.end());
            right = VerifySquenceOfBST(next);
        }
        return (left && right);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值