剑指Offer-23.二叉搜索树的后序遍历序列(C++/Java)
题目:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
分析:
二叉树的后序遍历也就是先访问左子树,再访问右子树,最后访问根节点,所以不难发现,所给的数组最后一个元素一定是二叉搜索树的根节点,而如果数组是二叉搜索树的后续遍历的话,就一定会根据数值划分两部分,左边是根节点的左子树,剩下的部分则是根节点的右子树。左子树的数值均小于根节点,右子树的数值均大于根节点。
例如{5,7,6,9,11,10,8},8是二叉搜索树的根节点,{5,7,6}是左子树,{9,11,10}是右子树。再递归判断。
6是根节点,5是左子树,7是右子树,由于只剩一个元素了,判断中止,同理{9,11,10}也是如此。
但如果不是后序遍历的序列,如{7,4,6,5}
5是根节点,7,4,6三个元素没有办法划分出左右子树,因为二叉搜索树的特性我们知道,左子树所有元素的值都小于根节点,右子树的值均大于根节点,无论是{7},{4,6}还是{7,4},{6}均不符合二叉搜索树的性质,在编程实现的过程中,我们可以遍历数组,当出现第一个大于根节点的元素时,便认为之前的所有元素时这个根节点的左子树,而排除最后一个元素剩下的所有元素便是右子树,查看右子树中的元素如果有小于根节点的元素,便可以直接判断不是二叉搜索树的后续遍历,如果没有就递归执行下去。
程序:
C++
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
if(sequence.size() == ) return false;
return helper(sequence, , sequence.size());
}
bool helper(vector<int> &v, int index, int length){
if(length <= )
return true;
int i = ;
for(; i < length-; ++i){
if(v[index + i] > v[index + length -])
break;
}
for(int j = i; j < length-; ++j){
if(v[index + j] < v[index + length -])
return false;
}
return helper(v, index, i) && helper(v, index+i, length-i-);
}
};
Java
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence.length == 0) return false;
return helper(sequence, 0, sequence.length);
}
public boolean helper(int [] sequence, int index, int length){
if(length <= 1)
return true;
//找到第一个大于根节点的元素偏移量,此元素右侧序列为右子树(包括)
int i = 0;
for(; i < length - 1; ++i){
if(sequence[index + i] > sequence[index + length -1])
break;
}
//检查右子树元素是否都大于根节点
for(int j = i; j < length - 1; ++j){
if(sequence[index + j] < sequence[index + length -1])
return false;
}
return helper(sequence, index, i) && helper(sequence, index+i, length-i-1);
}
}
剑指Offer-23.二叉搜索树的后序遍历序列(C++/Java)的更多相关文章
- 剑指Offer 23. 二叉搜索树的后序遍历序列 (二叉搜索树)
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 题目地址 https://www.nowcoder ...
- [剑指offer] 23. 二叉搜索树的后序遍历序列
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 思路: 解法一:递归 二叉搜索树,后序遍历的数组中 ...
- 《剑指offer》二叉搜索树的后序遍历序列
本题来自<剑指offer> 二叉搜索树的后序遍历序列 题目: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字 ...
- 剑指Offer:二叉搜索树的后序遍历序列【33】
剑指Offer:二叉搜索树的后序遍历序列[33] 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. ...
- 剑指 Offer 33. 二叉搜索树的后序遍历序列 + 根据二叉树的后序遍历序列判断对应的二叉树是否存在
剑指 Offer 33. 二叉搜索树的后序遍历序列 Offer_33 题目详情 题解分析 本题需要注意的是,这是基于一颗二叉排序树的题目,根据排序二叉树的定义,中序遍历序列就是数据从小到大的排序序列. ...
- 剑指 Offer 33. 二叉搜索树的后序遍历序列
剑指 Offer 33. 二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同. ...
- 【剑指Offer】二叉搜索树的后序遍历序列 解题报告(Python)
[剑指Offer]二叉搜索树的后序遍历序列 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-intervi ...
- 【剑指offer】二叉搜索树的后序遍历序列
转载请注明出处:http://blog.csdn.net/ns_code/article/details/26092725 剑指offer上的第24题,主要考察递归思想,九度OJ上AC. 题目描写叙述 ...
- 【Java】 剑指offer(33) 二叉搜索树的后序遍历序列
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如 ...
- Go语言实现:【剑指offer】二叉搜索树的后序遍历序列
该题目来源于牛客网<剑指offer>专题. 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. Go ...
随机推荐
- ride.py打不开RF,而是打开pycharm
标题中问题的解决方式: 进入到E:\soft\Python\Python36\Scripts,选中ride.py右键-打开方式选择python即可
- vue-property-decorator用法
vue-property-decorator这个库完全依赖于vue-class-component,所以在使用这个库之前请先阅读它, 不管啥反正都是装饰器而已 vue-property-decorat ...
- linux 基本操作--笔记
linux 基本操作: pwd 显示当前目录 ll 用于查看文件和目录,即list,其参数比较多 -l 列出数据串,包含文件的属性和权限数据等 -a 列出全部文件,包含隐藏文件 -d 仅列出目录本身, ...
- 设计模式(二十一)Proxy模式
在面向对象编程中,“本人”和“代理人”都是对象.如果“本人”对象太忙了,有些工作无法自己亲自完成,就将其交给“代理人”对象负责. 示例程序的类图. 示例程序的时序图.从这个时序图可以看出,直到调用pr ...
- ThreadPoolExecutor源码中的适配器模式
什么是适配器模式 网上已有很多的教程,不细讲了.可以参考:五分钟了解设计模式(3)---适配器模式 在适配器模式中,一定要识别清楚,Target Adaptee Adapter分别是哪些类或接口,这样 ...
- Everything 信息泄露
google语法: inurl:Diagnostics/index 这个无意间看到别人找到的,其实是everything自带的http服务器功能开启了忘记关,算是管理员自己的疏忽 可以看到开了ever ...
- 转:nginx和php-fpm的两种通信方式
原文地址:https://segmentfault.com/q/1010000004854045 Nginx和PHP-FPM的进程间通信有两种方式,一种是TCP,一种是UNIX Domain Sock ...
- 前端与算法 leetcode 1. 两数之和
目录 # 前端与算法 leetcode 1. 两数之和 题目描述 概要 提示 解析 解法一:暴力法 解法二:HashMap法 算法 传入[1, 2], [11, 1, 2, 3, 2]的运行结果 执行 ...
- 【ObjectC—浅copy和深copy】
一.OC设计copy的目的 为了能够从源对象copy一个新的对象副本,改变新对象(副本)的时候,不会影响到原来的对象. 二.实现copy协议 OC提供了两种copy方法:copy和mutableCop ...
- 使用Typescript重构axios(五)——实现基础功能:处理请求的header
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...