【剑指Offer】面试题33. 二叉搜索树的后序遍历序列

题目

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
参考以下这颗二叉搜索树:

     5
    / \
   2   6
  / \
 1   3

示例 1:

输入: [1,6,3,2,5]
输出: false

示例 2:

输入: [1,3,2,6,5]
输出: true

提示:数组长度 <= 1000

思路

在后序遍历中,数组最后一个数为根节点的值,其它数字可以分为两部分,前部分为左子树的值,它们都比根节点值小;后部分为右子树的值,它们值都比根节点值大。依次递归判断判断左右子树是否满足二叉搜索树特性。

代码

时间复杂度:O(n)
空间复杂度:O(1)

class Solution {
public:
    bool verifyPostorder(vector<int>& postorder) {        
        int size = postorder.size();
        if (size == 0) return true;
        return helper(postorder, 0, size - 1);
    }

    bool helper(vector<int> &postorder, int start, int end) {
        if (start > end) return false;
        int root = postorder[end];  // 根节点值
        int i = start;
        for (; i < end; ++i) {  // 在二叉搜索树中左子树值小于根节点值
            if (postorder[i] > root) break;
        }
        int j = i;
        for (; j < end; ++j) {  // 在二叉搜索树中右子树值大于根节点值
            if (postorder[j] < root) return false;
        }
        bool left = true, right = true;
        if (i > start) left = helper(postorder, start, i - 1);  //递归判断左子树是否为二叉搜索树
        if (i < end) right = helper(postorder, i, end - 1);  //递归判断右子树是否为二叉搜索树
        return left && right;
    }
};
posted @ 2020-05-12 22:11  Galaxy_hao  阅读(235)  评论(0编辑  收藏  举报