牛客网《剑指Offer》 编程 23. 二叉树的后序遍历序列

题目描述

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

解题思路

二叉搜索树的特点:后序遍历的时候最后一个数是根节点。前面的数分为两个部分,本别是左子树部分和右子树部分。左子树不部分的所有数都比根节点小;右子树部分的所有数都比根节点大。

因此可以这样判定:

如果该二叉树空树,则返回false;

如果不为空,那么确定根节点为最后一个数。

以该数值为分界,将数组分成两个部分,前半部分为左子树,后半部分为右子树。(左右子树都可能为空)

只有当左右子树都为二叉搜索树的时候,该树才为二叉搜索树。所以接下来判断左右子树。

左子树一定为空或者是全都是小于根节点的数,不用逐个比较左子树中的数值和根节点的数值,直接继续判断左子树是否为二叉搜索树。(递归)。

首先逐个判断右子树中所有数值是否都大于根节点值,如果不是,则右子树不是二叉搜索树;如果是,则继续判断右子树是否是二叉搜索树(递归)。

最后 当左子树和右子树都是二叉搜索树的时候,才能够说明该树是二叉搜索树。

代码实现

class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
        if(sequence.empty()){return false;}
        int len=sequence.size();
        int root=sequence[len-1];
        int idx=0;
        vector<int> leftTree;
        vector<int> rightTree;
        bool left=true;
        bool right=true;
        while(idx<len-1&&sequence[idx]<root){
            idx++;
        }
        if(idx!=0)//左子树不为空,则接着判断是左子树是否是BST
        {
            //leftTree(sequence,sequence+idx);
            leftTree.insert(leftTree.begin(),sequence.begin(),sequence.begin()+idx);
            left=VerifySquenceOfBST(leftTree);
        }
        if(idx!=len-1){//因为在len-1位置上的元素是根元素
            for(int j=idx;j<len-1;j++){
                if(sequence[j]<root){
                    right=false;
                    break;
                }
            }
            if(right){
            rightTree.insert(rightTree.begin(),sequence.begin()+idx,sequence.begin()+len-1);
            right=VerifySquenceOfBST(rightTree);
            }
            
            
        }
        return left&&right;
    }
};

猜你喜欢

转载自blog.csdn.net/eriHanami/article/details/82810843