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

根据输入的整数数组判断是否为二叉搜索树的后序遍历结果。利用二叉搜索树的性质,后序遍历序列最后一个元素为根节点,然后划分左右子树进行递归验证。

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

题目描述

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

 

思路

(1)首先要清晰明白搜索二叉树的定义及其特点。左子树≤根,根≤右子树。而本题中明确指明没有重复数字。

(2)二叉树后序遍历的特点:左子树->右子树->根结点。

以序列【3 5 4 7 9 8 6】为例子,因为后序遍历,所以最后一个数必为根节点(6),而 <6 的部分为左子树部分,>6部分为右子树部分。找到第一个大于6的位置,即下标3(数值7),因为右边均要比根(6)大,所以从下标3开始遍历,一一比较后面的数是否大于6,如果满足就继续递归。左子树【3 5 4】这里4又为根结点,右子树【7 9 8】这里8又为根结点,所以按照前面方法继续判断。也就是递归。

 

代码

class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        return bst(sequence, 0, sequence.size() - 1);
    }
    
private:    
    bool bst(vector<int> seq, int begin, int end){
        // 边界条件
        if(seq.empty() || begin > end)
            return false;
 
        // 划分左右子树,并判断左右子树和根节点的关系
        int i = begin;
        for(; i < end; ++i)
            if(seq[i] > seq[end])
                break;
 
        int j = i;
        for(; j < end; ++j)
            if(seq[j] < seq[end])
                return false;
 
        // 判断左子树是不是二叉搜索树
        bool left = true;
        if(i > begin)
            left = bst(seq, begin, i - 1);
 
        // 判断右子树是不是二叉搜索树
        bool right = true;
        if(i < end - 1)
            right = bst(seq, i , end - 1);
 
        return left && right;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值