剑指offer之二叉搜索树的后序遍历序列

1.问题描述

题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。
例如,输入数组{5,7,6,9,11,10,8} ,则返回true,数组{7,4,6,5},则返回false。

2.分析

  • 什么是二叉搜素树?若左子树不为空,则左子树上节点的值都小于根节点值,若右子树不为空,则右子树上节点的值都打印根节点的值;
  • 此题一看,就知道是二叉搜索树是一个递归定义,我们使用递归的方法;

例如:输入{5,7,6,9,11,10,8} ,其中8是根节点,那么{5,7,6}都小于8,所以,是左子树;{11,10,8}都大于8,,所以是右子树。
之后分别分析{5,7,6}{11,10,8},都是一样的。

使用递归,那么要有退出递归的条件,即:递归边界,边界应该是,一颗树只有一个节点,即:一颗树其实是一个叶子节点的时候,那么就停止,返回true

相反,如何判断不是二叉搜索树?比如{7,4,6,5},应为7大于5,那么左子树为{},右子树为{7,4,6},但是右子树的4小于5,所以错误。这不是一颗二叉搜索树。

3.源代码:

// from [start,end)
bool VerifySquenceOfBSTCore(int sequence[],int start,int end)
{
    //若end - start ==1,表示此二叉树是一个叶子节点
    if(end - start == 1)
        return true;

    int rootValue = sequence[end - 1];

    int leftIndex = 0;
    while(leftIndex < end -1 && sequence[leftIndex] < rootValue ) ++leftIndex;

    int rightIndex = leftIndex;

    while(rightIndex<end -1 && sequence[rightIndex] > rootValue) ++rightIndex;

    //如果右子树全部都大于根节点的值,则rightIndex应该是等于end - 1
    if(rightIndex != end -1)
        return false;

    bool leftTrue = true;
    if(leftIndex > 0)
        leftTrue = VerifySquenceOfBSTCore(sequence,0,leftIndex);
    bool rigthTrue = true;
    if(leftIndex < end -1)
        rigthTrue = VerifySquenceOfBSTCore(sequence,leftIndex,rightIndex);

    return leftTrue&&rigthTrue;
}

bool VerifySquenceOfBST_1(int sequence[], int length)
{
    if(sequence == nullptr || length <=0)
        return false;

    return VerifySquenceOfBSTCore(sequence,0,length);

}

4.结论

  • 知道什么是二叉搜索树
  • 二叉搜索树的后序遍历
  • 涉及到树,很多时候使用递归方法可以方便解决问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值