二叉搜索树后序序列

1.题意

给定一个序列,判断此序列是否是一个二叉搜索树的后续遍历序列

  • 二叉搜索树:左子树都比根节点小,右子树都比根节点大

2.分析

  • 后序遍历序列,最后一个是根节点

  • 比根节点小的的是左子树部分,可以无左子树

  • 剩下的是右子树部分,必须比根节点大,可以无右子树

  • 递归检查序列的每段,直到检查段长度为1(到叶子节点)

3.代码

bool isOrderBST(int* a, int length)
{
    if(a==NULL || length<=0)
        return false;
    int root = a[length-1];

    int leftEnd = 0;
    while(leftEnd<length-1 && a[leftEnd]<root)
        leftEnd++;
    //此时leftEnd等于左子树长度,a[leftEnd]指向右子树第一个

    for(int i=leftEnd; i<length-1; i++)
    {
        if(a[i] < root)
            return false;//右子树小于根节点,不符合BST定义
    }

    bool left = true;
    if(leftEnd > 0)//有左子树
        left = isOrderBST(a, leftEnd);

    if(left == false)
        return false;//左边不符合,没必要接着判断右边,剪枝

    bool right = true;
    if(leftEnd < length - 1)//有右子树
        right = isOrderBST(a+leftEnd, length-1-leftEnd);

    return right;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值