题目描述

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

参考以下这颗二叉搜索树:

     5/ \2   6/ \1   3

示例:

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

解题思路

首先,要明确两个性质:

  1. 二叉搜索树,左子树节点最大值 < 根节点值 < 右子树节点最大值,且左、右子树亦为二叉搜索树;
  2. 后续遍历:数组内顺序为左、右、根。其中左、右可能为空、单节点、复数节点(嵌套左、右、根)。

因此,思路就很简单了:

  1. 根据后续遍历数组从大维度向小维度划分数组(左子树、右子树、根节点),即分治思想!
  2. 遍历检查,左子树所有节点数值应小于根节点,右子树所有节点数值应大于根节点。
  3. 递归第一步划分后的左右子树。

实现细节:

  • 划分子树,从右向左划分,最右边一定为根节点,遇到一个小于根节点值的节点前的子数组即为右子树,剩余为左子树;
  • 由于划分过程,右子树一定合法,因此只需检查左子树;
  • 返回结果需要左右子树都合法,因此使用 && 连接。

代码实现

class Solution {public:bool verifyPostorder(vector<int>& postorder) {return dfs(postorder, 0, postorder.size());}bool dfs(vector<int>& postorder, int begin, int end){if(end - begin <= 1) return true;int temp = postorder[end - 1];int posi = end - 2;for(; posi >= 0; posi--){if(postorder[posi] < temp) break;}for(int i = posi; i >= 0; i--){if(postorder[i] > temp) return false;}return dfs(postorder, begin, posi + 1) && dfs(postorder, posi + 1, end - 1);}
};

运行结果:

使用单调栈可能性能上会有提升,这个我们以后再讲。

【分治】剑指 Offer 33. 二叉搜索树的后序遍历序列相关推荐

  1. 【LeetCode】剑指 Offer 33. 二叉搜索树的后序遍历序列

    [LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 文章目录 [LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 package offer;public cl ...

  2. 剑指 Offer 33. 二叉搜索树的后序遍历序列

    剑指 Offer 33. 二叉搜索树的后序遍历序列 原始题目链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-hou-xu-bian- ...

  3. 二叉排序树的后序遍历序列必然是递增的_剑指offer 33——二叉搜索树的后序遍历序列...

    本题主要在于考察对二叉搜索树和后序遍历的理解. 原题 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同 ...

  4. 【超100%解法】剑指 Offer 33. 二叉搜索树的后序遍历序列

    立志用最少的代码做最高效的表达 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同. 示例 1: 输入: ...

  5. 2021-08-24剑指 Offer 33. 二叉搜索树的后序遍历序列

    将二叉树划分为左右子树,分别对左右子树进行验证是否为二叉树, 根节点的下标为i, 右子树的开端为第一个大于根节点的数字m, 则左边的子树为[0,m-1],右边的子树的下标为[m,i-1] (这个不对, ...

  6. 剑指offer之二叉搜索树的后序遍历序列

    剑指offer之二叉搜索树的后序遍历序列 欢迎关注作者博客 简书传送门 题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个 ...

  7. 剑指offer 33. 二叉搜索树的后序遍历

    声明:本系列博客是对何海涛<剑指offer>的关键点总结. 1.问题描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果,如果是返回true,否则返回false.假设输入的数 ...

  8. 一刷328-递归recur-剑指 Offer 33. 二叉搜索树的后序遍历序列(m)

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

  9. 剑指笔记——33.二叉搜索树的后序遍历序列

    题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No. 假设输入的数组的任意两个数字都互不相同. 思路:在这个题中要注意是二叉搜索树,二叉搜索树满足左 ...

最新文章

  1. Delphi中的容器类(二)
  2. 如何获取MDC产品文档
  3. hdu5492(2015合肥网络赛I题)
  4. 程序语言python循环_《python语言程序设计》_第5章_循环
  5. HashMap方法源码
  6. lua——赢三张牌型处理相关算法(中)——牌型判定
  7. oracle的count的null为0,count(字段)不统计null值
  8. springboot uniapp疫情防控打卡系统源码
  9. php处理excel图表,php导入excel的图片
  10. 非单射一致性和单射一致性的概念辨析
  11. ArcMap模型:批量导出shp
  12. 茶云个人导航系统v1.2源码 带后台+网易云歌单播放功能+腾讯智能在线客服功能
  13. 关于 BBBB 站视频删除问题解释
  14. UCenter Home
  15. 2021年煤矿井下爆破考试内容及煤矿井下爆破考试资料
  16. IntelliJ IDEA中文注释字体更换最佳方法
  17. 计算机教室管理使用标准,计算机教室管理标准制度.doc
  18. Ubuntu 磁盘管理  命令行工具
  19. ABAP 关键字(1)
  20. 推荐两个实用的PCIe工具软件

热门文章

  1. 仿真器VCS solver 对包含 function 约束的求解
  2. 建立大学生职业成长规划4个步骤
  3. 百度网盘加速无限试用_单次付费来了!百度网盘推出3元/5分钟加速下载服务
  4. 怎么抓雷电模拟器的包_fiddler+雷电模拟器进行APP抓包(可抓HTTPS)
  5. 太赞了!微软《dotnet中文手册》火了,完整PDF开放下载!
  6. 什么是关键业务(Mission Critical)?
  7. 使用Javascript无限添加QQ好友原理解析
  8. 11.网络编程-基础知识 C++/Linux-2022-10-20
  9. 《花花刑警》“型警造型”全身名牌
  10. 双声道转化为单声道matlab实现