AcWing 46. 二叉搜索树的后序遍历序列

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。

如果是则返回true,否则返回false。

假设输入的数组的任意两个数字都互不相同。

样例

输入:[4, 8, 6, 12, 16, 14, 10]

输出:true

问题分析

用judge函数判断某一区间是不是某二叉搜索树的后序遍历的结果。这个区间最右边的元素是二叉搜索树的根节点。然后我们遍历除了根节点的区间,当遇到第一个不小于根节点的元素时停止,这时就已经找出了左子树的节点,然后继续遍历剩下的区间,也就是检查右子树的节点的值,如果不是都大于根节点的值,说明肯定不是二叉搜索树了,返回false。如果到这里都满足,那么接下来分别用左区间调用递归函数judge和用右区间调用递归函数judge,如果两个递归函数都返回true那么返回true,否则返回false。

代码实现

class Solution {
public:
    bool verifySequenceOfBST(vector<int> sequence) {
        int n = sequence.size();
        if(n == 0)
            return true;
        return judge(0, n - 1, sequence);
    }
    
    bool judge(int start, int end, vector<int>& sequence){
        if(start >= end)
            return true;
        int root = sequence[end];
        int l = start;
        while(sequence[l] < root){
            ++l;
        }
        for(int i = l; i < end; i++){
            if(sequence[i] < root)
                return false;
        }    
        return judge(start, l - 1, sequence) && judge(l, end - 1, sequence);
    }
};

猜你喜欢

转载自blog.csdn.net/mengyujia1234/article/details/89857610