剑指offer题解(C语言)----JZ33 二叉搜索树的后序遍历序列

题目

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

数据范围: 节点数量 0≤n≤1000 ,节点上的值满足 1≤val≤10^{5} ,保证节点上的值各不相同
要求:空间复杂度 O(n) ,时间时间复杂度 O(n^{2})

提示:

1.二叉搜索树是指父亲节点大于左子树中的全部节点,但是小于右子树中的全部节点的树。

2.该题我们约定空树不是二叉搜索树

3.后序遍历是指按照 “左子树-右子树-根节点” 的顺序遍历

解析

二叉树大多时候都会用递归。

约定了空树不是搜索二叉树,因此首先需要检查每一个根节点下的左孩子是否小于根节点,右孩子是否大于根节点。

由于是后序遍历序列,由左右中的顺序,整棵树的根结点一定是Len-1这个结点。因此,整个序列中第一个比根节点大的点就是右子树的点,在这个点之前的所有点都是左子树的点。

用同样的办法对左子树和右子树进行判断,用递归法得出最终的结论。

代码

#include<stdbool.h>
 
bool Check_core(int *a, int Len)
{
    int index;
    int i;
    bool flag = false;
    if (a == NULL || Len <= 1)
        return true;
     
    for (i = 0; i < Len; i++)
    {
        if (!flag&&a[i] > a[Len - 1]) //判断从哪里开始是右子树,右子树的孩子一定都比其根节点大
        {
            index = i;
            flag = true;
        }
        if (flag && a[i] < a[Len - 1]) //判断从哪里开始是左子树,左子树的孩子一定都比其根节点小
            return false;
    }
    if (i == Len || index == 0)
        return Check_core(a, Len - 1);
    else
        return Check_core(a, index)&& Check_core(a+index, Len- index-1); //分别判断左右子树是否满足小的都小,大的都大
         
}
bool VerifySquenceOfBST(int* sequence, int sequenceLen ) {
    if (sequence == NULL || sequenceLen <= 0)
        return false;
    return Check_core(sequence, sequenceLen);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值