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

题目描述

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

思路

  • 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。

  • 利用二叉搜索树的特点,在后序序列中通过比较与根结点(也就是最后一个值)的关系,找到相应的左子树和右子树,如果左子树或者右子树不符合二叉搜索树的定义,就不是二叉搜索树了

AC代码

#include <iostream>
#include <vector>
using namespace std;

class Solution
{
public:
    bool VerifySquenceOfBST(vector<int> sequence)
    {
        return so(sequence,0,sequence.size()-1);
    }
    bool so(vector<int> sequence, int begin, int end)
    {
        if (sequence.empty() || begin > end)
            return false;
        int root = sequence[end];
        int i = begin;
        for (; i < end; i++)//注意这里不包括end,因为只需要比较end前面的数字而已
        {
            if (sequence[i] > root)
                break;
        }
        int j = i;
        for (; j < end; j++) //从j开始就是判断右子树是否都大于根结点
        {
            if (sequence[j] < root)
                return false;
        }

        bool left = true;
        if (i > begin) //判断是否有左子树
            so(sequence, begin, i - 1);

        bool right = true;
        if (i < end - 1) //判断是否有右子树
            so(sequence, i, end - 1);
        return left && right;
    }
};
int main()
{
    Solution s;
    vector<int>v = {4,5,2,6,7,3,1};
    if (s.VerifySquenceOfBST(v) == true)
        cout <<"yes" <<endl;
    else
    {
        cout <<"no" << endl;
    }
    
    return 0;
}
/*
测试样例:功能测试
- 只有右子树的bst {8,7,6,5}
- 只有左子树的bst {1,2,3,4}
- 不是搜索树 {7,4,6,5}
- 是搜索二叉树{4,5,2,6,7,3,1}==》 1,2,3,4,5,6,7广度遍历的完全二叉树

特殊测试:空序列

*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值