zoukankan      html  css  js  c++  java
  • 【剑指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;
        }
    };
    
  • 相关阅读:
    条形码识别
    使用边缘检测,将图像旋转到水平位置
    pyzbar 安装
    关于跑别人代码中遇到的问题
    %matplotlib inline
    git 相关流程和报错解决
    原码、反码和补码
    opencv 图像resize
    前端跨域解决方案汇总
    vuecli3 引入构建版本的2种方式
  • 原文地址:https://www.cnblogs.com/galaxy-hao/p/12879170.html
Copyright © 2011-2022 走看看