[剑指offer] 二叉搜索树的后序遍历序列 (由1个后续遍历的数组判断它是不是BST)
①题目
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
②思路
1、后续遍历的数组里,最后一个元素是根。
2、在BST里,左子树每个元素<根<右子树每个元素
3、从第0位开始,找到第一个>根节点的元素,记录此位置i。在此位置之前都属于左子树(此时已经断定左子树都小于根节点)
4、检查右子树是否都大于跟节点(从第i位开始,到根节点前)
5、递归判断左右子树是否都属于BST,也即重复3-4步;
③代码
- public class Solution {
- public boolean VerifySquenceOfBST(int [] sequence) {
- boolean[] res = new boolean[1];
- res[0] = true;
- if(sequence.length==0) //如果输入为空,那么直接返回false
- return false;
- isBST(0,sequence.length-1,res,sequence); //调用函数,在函数里根据各种判断条件来改动res[0]
- return res[0];
- }
- public int isBST(int start,int end,boolean[] res,int[] sequence){
- if(start>=end) //1种退出条件
- return start;
- int mid = (start+end)>>>1; //除以2
- int curr_root = sequence[end];
- int i=start; //这一步不能写在for循环里面,否则会在第21行报错说不认识i
- for(;i< end;i++){
- if(sequence[i]>curr_root)
- break; //一旦找到第一个>根的元素,立刻break出去
- }
- for(int j=i;j< end;j++){
- if(sequence[j]<curr_root){
- res[0]=false; //改变res[0]的值
- return start; //isBST这个函数只是为了改动res[0]的值,所以随便返回个什么东西就行了,比如我返回个start
- }
- }
- isBST(start,mid-1,res,sequence); //递归判断左子树,
- isBST(mid,end-1,res,sequence); //递归判断右子树
- return start;
- }
- }
④学到的东西
1、做了Leeccode的108题,于是把>>>的写法学来了,用在了本题第14行。
2、一定要学会怎么用后序遍历数组来判断是不是BST,也就是本题第②点的分析过程;
3、使用res[0]标志位,并且用整个isBST函数来改变res[0]的值,以至于isBST这个函数的返回值返回什么都不重要了,这种方法我是从《程序员代码面试指南:IT名企算法与数据结构题目最优解》的145页学来的。
[剑指offer] 二叉搜索树的后序遍历序列 (由1个后续遍历的数组判断它是不是BST)的更多相关文章
- 剑指Offer 二叉搜索树的后序遍历序列
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 思路: 后续遍历数组的尾部为根节点,前面的部分 ...
- 剑指Offer——二叉搜索树的后序遍历序列
题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 分析: 二叉查找树(Binary Search ...
- 用js刷剑指offer(二叉搜索树的后序遍历序列)
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 牛客网链接 js代码 function Verif ...
- 剑指offer--30.二叉搜索树的后序遍历序列
正常情况下,因为二叉搜索树,左子树所有结点比根小,右子树所有结点比根大,所以循环一遍就能结束 ----------------------------------------------------- ...
- 剑指Offer-23.二叉搜索树的后序遍历序列(C++/Java)
题目: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 分析: 二叉树的后序遍历也就是先访问左子树,再访问右 ...
- 剑指offer24 二叉搜索树的后序遍历序列
自己写的更简洁的代码 class Solution { public: bool VerifySquenceOfBST(vector<int> sequence) { int length ...
- 剑指offer 二叉搜索树与双向链表
html, body { font-size: 15px; } body { font-family: Helvetica, "Hiragino Sans GB", 微软雅黑, & ...
- 剑指Offer——二叉搜索树与双向链表
题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 分析: 二叉搜索树,中序遍历就是排序的. 所以我们利用中序遍历,将前后两 ...
- 剑指offer 二叉搜索树和双向链表
剑指offer 牛客网 二叉搜索树和双向链表 # -*- coding: utf-8 -*- """ Created on Tue Apr 9 18:58:36 2019 ...
随机推荐
- Qt5教程: (3) 自定义信号与槽
1. 自定义槽 槽可以是任何成员函数.普通全局函数.静态函数 槽函数和信号的参数和返回值要一致 由于信号是没有返回值的, 槽函数也一定没有返回值 首先在mainwidget.h中添加槽函数: publ ...
- PHP each
1.函数的作用:遍历数组元素 2.函数参数: @params array &$array 3.例子: <?php $arr = ['Boy','Girl']; while(list($k ...
- PHP array_udiff_uassoc
1.函数的参数:返回数组的差集.用定义的函数比较键值和值. 2.函数的参数: @params array $array @params array $array1 ... @params callab ...
- 这可能就是你苦苦寻找免费、高颜值、功能强大的 Markdown 编辑器(共5款)
本文作者 | HelloGitHub-小猪蹄 Markdown 是一个轻量级的标记语言,语法简单.容易上手,它深受程序员.博客主等人群的钟爱.随着越来越多的博客系统支持 Markdown,它也开始越来 ...
- windows下cmd组合命令和管道命令
组合命令:&& 管道命令:|
- postman简单介绍
- 18.Tomcat基本应用
1.JVM基本介绍 JAVA编译型 ---> 编译 C 编译型---> linux --->编译一次 windows --->编译一次 macos ubuntu 跨平台 移值型 ...
- SpringBoot SpringCloud版本对应
- javascript核心基础总结
对<深入理解javascript原型和闭包系列>,<深入理解javascript系列>和<javascript深入系列>的学习总结 词法作用域 作用域就是,程序查找 ...
- 对于谷歌开源的TensorFlow Object Detection API视频物体识别系统实现教程
本教程针对Windows10实现谷歌近期公布的TensorFlow Object Detection API视频物体识别系统,其他平台也可借鉴. 本教程将网络上相关资料筛选整合(文末附上参考资料链接) ...