①题目

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出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页学来的。

最新文章

  1. swift学习笔记3——类、结构体、枚举
  2. .NET Framework(.config)的配置文件架构
  3. C# Excel 为图表添加趋势线、误差线
  4. JS解析XML文件和XML字符串
  5. jQuery应用之(二)使用jQuery管理选择结果(荐)
  6. CVE-2015-7547
  7. C#格式化输出
  8. jquery获取元素索引值index()方法
  9. SQL2008附加数据库提示错误:5120
  10. A题笔记(3)
  11. Scrambled Polygon - POJ 2007(求凸包)
  12. Solr中schema.xml的解释
  13. SQL SERVER2012 无法连接远程服务器
  14. 学习笔记之08试用div做网页(滨院)-小作业
  15. iOS控制反转(IoC)与依赖注入(DI)的实现
  16. MySQL存储过程(PROCEDURE)(一)
  17. Chapter 4 Invitations——27
  18. Go语言 并发编程
  19. npm 更新版本
  20. favicon.ico--网站标题小图片二三事

热门文章

  1. Jenkins部署(基于windows)
  2. CSRF漏洞实战靶场笔记
  3. 域渗透-Kerberos协议中spn的应用
  4. PHP array_filter
  5. H5实现图表和地图
  6. 微信支付 get_brand_wcpay_request fail,Undefined variable: openid
  7. JS旋转和css旋转
  8. 代码作家Alpha冲刺阶段博客目录
  9. redis面试题及答案
  10. mac os 10.15 virtualBox6.0.12崩溃