【剑指offer】23-二叉搜索树的后续遍历

本文系《剑指offer》的刷题记录,通过牛客网在线平台测试通过。
在线测试平台:牛客网
编程资料获取:CodeLab

1- Description

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

2-Solution

我们先来了解一下什么是二叉搜索树:

二叉查找树(BinarySearchTree),也称为二叉搜索树、有序二叉树或排序二叉树是指一棵空树或者具有下列性质的二叉树:
若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值
若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
任意节点的左、右子树也分别为二叉查找树;
没有键值相等的节点。

再了解了二叉搜索树之后,我们可以对后续遍历序列进行分析:
1-首先假设后续遍历结果为{5,7,6,9,11,10,8},则我们知道最后一个值8为二叉树的根结点,而在这一序列中前3个数字小于8,所以为左子树的结点,后3个数字大于8即为右子树;
2-由于左子树和右子树均需要满足搜索二叉树的性质,所以我们继续对左子树和右子树进行和上面相同的分析,实际上就是一个递归调用的过程,这样就可以建立如下的搜索二叉树:
在这里插入图片描述

3-我们可以拿序列{7,4,6,5}这一序列进行分析,发现第一个元素7大于根结点值5,说明没有左子树,但是发现再右子树中4大于了根结点值5,所以这是一个不满足搜索二叉树的序列

根据以上的分析步骤,我们可以利用递归的方法写成如下代码:

class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        vector<int> lefttree;//定义左子树
        vector<int> righttree;//定义右子树

        bool bleft = true;
        bool bright = true;
        int i = 0;
        if(sequence.size() <= 0)  return false;
        for(; i < sequence.size()-1;++i){
            if(sequence[i] > sequence[sequence.size() - 1]) break;//如果有元素大于根结点,则进入右子树循环
            lefttree.push_back(sequence[i]);
        }
        for(int j = i;j < sequence.size()-1;++j){
            if(sequence[j] < sequence[sequence.size() - 1]) return false;//右子树内有小于根结点的值,直接返回false
            righttree.push_back(sequence[j]);
        }
        //只要左右子树不为空,则进入递归
        if(lefttree.size() > 1)
            bleft = VerifySquenceOfBST(lefttree);
        if(righttree.size() > 1)
            bright = VerifySquenceOfBST(righttree);
        return (bleft && bright);
    }
};

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值