牛客剑指Offer面试题33:二叉搜索树的后序遍历序列

题目描述

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

思路

二叉搜索树(二叉排序树/二叉查找树)
定义:若它的左(右)子树不空,则左(右)子树上所有节点的值均小于(大于)它的根节点的值.
意义:构建一棵二叉搜索树的目的不是为了排序,而是为了提高查找和删除关键字的速度.
理论思路:
后序遍历序列的最后一个数字为根节点值,则数组前面可分为两部分(连续的小于根节点的部分为左子树,第一个大于根节点的节点及其后面至根节点前的所有节点为右子树.若违背了这一规律则该序列非二叉搜索树的后序遍历序列)
代码思路:
1.在二叉搜索树有效的前提下,找到左子树的节点并判断右子树(余下节点除根节点)是否有大于根节点的;
2.若存在左子树,递归判断左子树是否为BST;同理右子树

代码

class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        //判断有效性
        if(sequence.empty())
            return false;
        //长度及根节点
        int length = sequence.size();
        int root = sequence[length - 1];
        //定义用于找左子树的游标i
        int i = 0;
        //找到所有左子节点
        for(; i < length - 1; ++i)
        {
            if(sequence[i] > root)
                break;
        }
        //判断余下节点至根节点之间节点是否均为右子节点
        int j = i;
        for(; j < length - 1; ++j)
        {
            if(sequence[j] < root)
                return false;
        }
        //声明左子树是否为二叉搜索树标识
        bool left = true;
        //若有左子树存在,则递归判断余下
        if(i > 0)
        {
            vector<int> leftSequence;
            for(int indexLeft = 0; indexLeft < i;++indexLeft)
            {
                leftSequence.push_back(sequence[indexLeft]);
            }
            left = VerifySquenceOfBST(leftSequence);
        }
            
        //同理声明右子树标识
        bool right = true;
        if(i < length - 1)
        {
            vector<int> rightSequence;
            for(int indexRight = i; indexRight < length - 1;++indexRight)
            {
                rightSequence.push_back(sequence[indexRight]);
            }
            right = VerifySquenceOfBST(rightSequence);
        }
        return (left && right);
    }
};
发布了65 篇原创文章 · 获赞 0 · 访问量 2050

猜你喜欢

转载自blog.csdn.net/ljmiiianng/article/details/103677247