题目:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。
假设输入的数组的任意两个数字都互不相同。
-----------
示例:参考以下这颗二叉搜索树:5/ \2   6/ \1   3示例 1:
输入: [1,6,3,2,5]
输出: false示例 2:
输入: [1,3,2,6,5]
输出: true提示:
数组长度 <= 1000
----------------
思考:
后序遍历定义: [ 左子树 | 右子树 | 根节点 ] ,即遍历顺序为 “左、右、根” 。
二叉搜索树定义: 左子树中所有节点的值 << 根节点的值;右子树中所有节点的值 >> 根节点的值;其左、右子树也分别为二叉搜索树。

根据二叉搜索树的定义,可以通过递归,判断所有子树的 正确性 (即其后序遍历是否满足二叉搜索树的定义)
若所有子树都正确,则此序列为二叉搜索树的后序遍历。
-----------
递归解析:
1、终止条件: 当 i≥j ,说明此子树节点数量 ≤1 ,无需判别正确性,因此直接返回 true;
2、递推工作:1、划分左右子树: 遍历后序遍历的 [i, j] 区间元素,寻找 第一个大于根节点 的节点,索引记为 m 。此时,可划分出左子树区间 [i,m-1]、右子树区间 [m, j - 1]、根节点索引 j 。2、判断是否为二叉搜索树:1、左子树区间 [i, m - 1] 内的所有节点都应 << postorder[j]。而第 1.划分左右子树 步骤已经保证左子树区间的正确性,因此只需要判断右子树区间即可。2、右子树区间 [m, j-1]内的所有节点都应 >> postorder[j]。实现方式为遍历,当遇到]≤postorder[j] 的节点则跳出;则可通过 p = j判断是否为二叉搜索树。
3、返回值: 所有子树都需正确才可判定正确,因此使用 与逻辑符 && 连接。1、p = j: 判断 此树 是否正确。2、recur(i, m - 1) : 判断 此树的左子树 是否正确。3、recur(m, j - 1): 判断 此树的右子树 是否正确。
-----------------
复杂度分析:
时间复杂度 O(N^2) : 每次调用 recur(i,j)减去一个根节点,因此递归占用 O(N) ;最差情况下(即当树退化为链表),每轮递归都需遍历树所有节点,占用 O(N) 。
空间复杂度 O(N) : 最差情况下(即当树退化为链表),递归深度将达到 N 。
-----------------
class Solution {public boolean verifyPostorder(int[] postorder) {return recur(postorder, 0, postorder.length - 1);//递归}private boolean recur(int[] postorder, int i, int j) {if (i >= j) return true;//特判:此时此子树节点数量 <=1 无需判别正确性int curIndex = i;while (postorder[curIndex] < postorder[j]) curIndex++;int m = curIndex;//while循环找到第一个大于根节点的节点,索引为mwhile (postorder[curIndex] > postorder[j]) curIndex++;//确保右子树[m, j-1]的值都大于根节点return curIndex == j && recur(postorder, i, m - 1) && recur(postorder, m, j - 1);}
}
/**return p == j && recur(postorder, i, m - 1) && recur(postorder, m, j - 1);p == j: while (postorder[p] > postorder[j]) p++; 当p为j-1时,满足循环条件 p++,结果是p == j通过p==j 判断是否为二叉搜索树
recur(postorder, i, m - 1): 判断左子树是否正确   i---m - 1
recur(postorder, m, j - 1): 判断右子树是否正确   m---j - 1*/

LC

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

  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. 【超100%解法】剑指 Offer 33. 二叉搜索树的后序遍历序列

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 向oracle中导入*.csv文件
  2. 36 岁开发者应聘被拒,这 3 位 50 岁程序员的生存秘籍送给你!
  3. Mysql5.7安装错误处理与主从同步及!
  4. 30 整数中1出现的次数(从1到n整数中1出现的次数)这题很难要多看*
  5. mysql读取整张表_mysql 一个表里的信息是读取另一张表来的
  6. 德哥的PostgreSQL私房菜 - 史上最屌PG资料合集
  7. paddlepaddle-VisualDL2.0对项目进行可视化调参
  8. python office库_python库编程.os平台.office平台
  9. 游戏自审自查报告_开发的射箭小游戏上线了,分享一下我在开发过程中遇到的问题...
  10. java.lang.NoSuchMethodError: javax.servlet.http.HttpServletRequest.isAsyncStarted()Z 的解决
  11. 信息学奥赛一本通 1059:求平均年龄 | OpenJudge NOI 1.5 01
  12. 如何将FLex AIR运行环境与AIR程序一起打包
  13. jQuery插件管理方案
  14. FileUpload1.PostedFile.FileName 获取的文件名
  15. Windows Dll 动态加载
  16. 怎么把图片做成gif动图?三步搞定gif在线制作
  17. Python 解决报错NameError: name ‘LEFT‘ is not defined
  18. 数据库篇-mysql主备搭建
  19. 运用CS-LBP提取裂纹的梯度特征
  20. 英文Essay写作诀窍讲解

热门文章

  1. EF Core学习笔记:关于主键 对IGuidGenerator的理解
  2. 挖机的涡轮增压器为什么会窜(漏)机油呢?有什么后果?
  3. Schedutil governor情景分析
  4. 账号密码注册登录忘记密码测试用例(挺详细的)
  5. 极简主义linux桌面,Ubuntu 16.04/17.10/18.04安装Zafiro极简图标主题
  6. H3C云实验室模拟器
  7. U8cloud V3.6 3.5 3.2 3.1 3.0 3.1 U8C
  8. RFID相关知识总结(超高频UHF)
  9. watch取消配对怎么重新配对_苹果Apple Watch重新配对方法_Apple Watch怎么重新配对-硬件之家...
  10. 前端学习---使用原生AJAX从本地txt文件中获取数据