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

【题目描述】输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果,如果是,则输出YES,不是输出NO,假设你的二叉搜索树的结点各不相同。

有关什么是二叉搜索树,请移步:https://blog.csdn.net/aaronlanni/article/details/79180890

由此可以看出,将一个二叉搜索树转换为一个后序遍历的序列,其根结点会将这个序列分为两部分,一部分比根节点小,一部分比根节点大,所以利用这个特性,将这个序列划分,之后观察,如果划分出来的序列在进行划分之时,是否仍然满足这个特性,如果满足,则是,反之,不是。

方法一:递归

在这个序列中,找第一部分,比根节点小的部分,将其压入到容器中,然后,按照这个方法,继续找第二部分,也将其压入到另一个容器中,如果找到了两部分,但是最后的下标与根节点的前一个下标不相等,则表明此时序列中要么是前半部分有大数,要么是后半部分有小数,因此这样的组合并不符合我们所找的序列。

class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        if(sequence.empty())
            return false;
        int size=sequence.size();
        vector<int> left;
        vector<int> right;
        int i=0;
        while(i<size-1)
        {
            if(sequence[i]<sequence[size-1])
            {
                left.push_back(sequence[i]);
                ++i;
            }
            else
                break;
        }
        int j=i;
        while(j<size-1)
        {
            if(sequence[j]>sequence[size-1])
            {
                left.push_back(sequence[j]);
                ++j;
            }
            else
                break;
        }
        bool vleft=true;
        if(i>0)
        {
            vleft=VerifySquenceOfBST(left);
        }
        bool vright=true;
         if(j<size-1)
        {
            vleft=VerifySquenceOfBST(right);
        }
        return vleft&&vright;//如果这两个有一个不符合,则会有false返回
    }
};

方法二:非递归

整体也是上面的思路,只不过在这个时候,重复遍历这个序列,只不过是在遍历的时候,每一次将最后一个根节点去除即可,直到只有一个结点即可

class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        if(sequence.empty())
            return false;
        int size=sequence.size();
        while(--size)//先将最后一个结点去除
        {
            int index=0;
            while(sequence[index]<sequence[size])
                ++index;
            while(sequence[index]>sequence[size])
                ++index;
            //找到两个序列之后,如果此时并没有到达最后的下标,表明序列不正确
            if(index<size)
                return false;
        }
        return true;
    }
};

大概的思路就是这样的,如果有什么错误,希望大家指正。

这世上哪有什么奇迹,奇迹源于不放弃!!!

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值