首页 > 其他 > 详细

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

时间:2020-05-12 22:36:50      阅读:89      评论:0      收藏:0      [点我收藏+]

题目

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回?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;
    }
};

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

原文:https://www.cnblogs.com/galaxy-hao/p/12879170.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!