[剑指offer] 二叉搜索树的后序遍历序列 (由1个后续遍历的数组判断它是不是BST)
2024-10-20 01:31:32
①题目
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出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页学来的。
最新文章
- swift学习笔记3——类、结构体、枚举
- .NET Framework(.config)的配置文件架构
- C# Excel 为图表添加趋势线、误差线
- JS解析XML文件和XML字符串
- jQuery应用之(二)使用jQuery管理选择结果(荐)
- CVE-2015-7547
- C#格式化输出
- jquery获取元素索引值index()方法
- SQL2008附加数据库提示错误:5120
- A题笔记(3)
- Scrambled Polygon - POJ 2007(求凸包)
- Solr中schema.xml的解释
- SQL SERVER2012 无法连接远程服务器
- 学习笔记之08试用div做网页(滨院)-小作业
- iOS控制反转(IoC)与依赖注入(DI)的实现
- MySQL存储过程(PROCEDURE)(一)
- Chapter 4 Invitations——27
- Go语言 并发编程
- npm 更新版本
- favicon.ico--网站标题小图片二三事