【分治】剑指 Offer 33. 二叉搜索树的后序遍历序列
题目描述
(中等)输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true
,否则返回 false
。假设输入的数组的任意两个数字都互不相同。
参考以下这颗二叉搜索树:
5/ \2 6/ \1 3
示例:
输入: [1,6,3,2,5]
输出: false
解题思路
首先,要明确两个性质:
- 二叉搜索树,左子树节点最大值 < 根节点值 < 右子树节点最大值,且左、右子树亦为二叉搜索树;
- 后续遍历:数组内顺序为左、右、根。其中左、右可能为空、单节点、复数节点(嵌套左、右、根)。
因此,思路就很简单了:
- 根据后续遍历数组从大维度向小维度划分数组(左子树、右子树、根节点),即分治思想!
- 遍历检查,左子树所有节点数值应小于根节点,右子树所有节点数值应大于根节点。
- 递归第一步划分后的左右子树。
实现细节:
- 划分子树,从右向左划分,最右边一定为根节点,遇到一个小于根节点值的节点前的子数组即为右子树,剩余为左子树;
- 由于划分过程,右子树一定合法,因此只需检查左子树;
- 返回结果需要左右子树都合法,因此使用
&&
连接。
代码实现
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. 二叉搜索树的后序遍历序列相关推荐
- 【LeetCode】剑指 Offer 33. 二叉搜索树的后序遍历序列
[LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 文章目录 [LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 package offer;public cl ...
- 剑指 Offer 33. 二叉搜索树的后序遍历序列
剑指 Offer 33. 二叉搜索树的后序遍历序列 原始题目链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-hou-xu-bian- ...
- 二叉排序树的后序遍历序列必然是递增的_剑指offer 33——二叉搜索树的后序遍历序列...
本题主要在于考察对二叉搜索树和后序遍历的理解. 原题 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同 ...
- 【超100%解法】剑指 Offer 33. 二叉搜索树的后序遍历序列
立志用最少的代码做最高效的表达 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同. 示例 1: 输入: ...
- 2021-08-24剑指 Offer 33. 二叉搜索树的后序遍历序列
将二叉树划分为左右子树,分别对左右子树进行验证是否为二叉树, 根节点的下标为i, 右子树的开端为第一个大于根节点的数字m, 则左边的子树为[0,m-1],右边的子树的下标为[m,i-1] (这个不对, ...
- 剑指offer之二叉搜索树的后序遍历序列
剑指offer之二叉搜索树的后序遍历序列 欢迎关注作者博客 简书传送门 题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个 ...
- 剑指offer 33. 二叉搜索树的后序遍历
声明:本系列博客是对何海涛<剑指offer>的关键点总结. 1.问题描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果,如果是返回true,否则返回false.假设输入的数 ...
- 一刷328-递归recur-剑指 Offer 33. 二叉搜索树的后序遍历序列(m)
题目: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false. 假设输入的数组的任意两个数字都互不相同. ----------- 示例:参考以下这 ...
- 剑指笔记——33.二叉搜索树的后序遍历序列
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No. 假设输入的数组的任意两个数字都互不相同. 思路:在这个题中要注意是二叉搜索树,二叉搜索树满足左 ...
最新文章
- Delphi中的容器类(二)
- 如何获取MDC产品文档
- hdu5492(2015合肥网络赛I题)
- 程序语言python循环_《python语言程序设计》_第5章_循环
- HashMap方法源码
- lua——赢三张牌型处理相关算法(中)——牌型判定
- oracle的count的null为0,count(字段)不统计null值
- springboot uniapp疫情防控打卡系统源码
- php处理excel图表,php导入excel的图片
- 非单射一致性和单射一致性的概念辨析
- ArcMap模型:批量导出shp
- 茶云个人导航系统v1.2源码 带后台+网易云歌单播放功能+腾讯智能在线客服功能
- 关于 BBBB 站视频删除问题解释
- UCenter Home
- 2021年煤矿井下爆破考试内容及煤矿井下爆破考试资料
- IntelliJ IDEA中文注释字体更换最佳方法
- 计算机教室管理使用标准,计算机教室管理标准制度.doc
- Ubuntu 磁盘管理 命令行工具
- ABAP 关键字(1)
- 推荐两个实用的PCIe工具软件
热门文章
- 仿真器VCS solver 对包含 function 约束的求解
- 建立大学生职业成长规划4个步骤
- 百度网盘加速无限试用_单次付费来了!百度网盘推出3元/5分钟加速下载服务
- 怎么抓雷电模拟器的包_fiddler+雷电模拟器进行APP抓包(可抓HTTPS)
- 太赞了!微软《dotnet中文手册》火了,完整PDF开放下载!
- 什么是关键业务(Mission Critical)?
- 使用Javascript无限添加QQ好友原理解析
- 11.网络编程-基础知识 C++/Linux-2022-10-20
- 《花花刑警》“型警造型”全身名牌
- 双声道转化为单声道matlab实现