作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO
联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬
学习必须往深处挖,挖的越深,基础越扎实!
阶段1、深入多线程
阶段2、深入多线程设计模式
阶段3、深入juc源码解析
阶段4、深入jdk其余源码解析
阶段5、深入jvm源码解析
码哥源码部分
码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】
码哥讲源码【炸雷啦!炸雷啦!黄光头他终于跑路啦!】
码哥讲源码-【jvm课程前置知识及c/c++调试环境搭建】
码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】
码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】
码哥讲源码【你水不是你的错,但是你胡说八道就是你不对了!】
码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】
终结B站没人能讲清楚红黑树的历史,不服等你来踢馆!
打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
public class Solution {
public boolean VerifySquenceOfBST(int [] sequence) {
if(sequence.length==0) {
return false;
}
if(sequence.length==1) {
return true;
}
int root=sequence.length-1;
return isSquenceOfBST(sequence,0,root);
}
public static boolean isSquenceOfBST(int a[],int start,int root) {
if(root==0)
return true;
int r=root-1;
while(r>start&&a[r]>a[root]) {
r--;
}
for(int i=start;i<r;i++) {
if(a[i]>a[root]) {
return false;
}
}
return isSquenceOfBST(a,start,r)&&isSquenceOfBST(a,start,root-1);
}
}
我个人感觉遇到二叉树问题,递归!递归!还是递归!没有递归解决不了的二叉树!
讲解一下我解题思路:
假设有这样一个二叉树:
后序遍历为: 0,2,1,4,3,6,9,8,7,5
首先最右边那个肯定是根结点(root),这个没有问题对吧;
然后我们仔细观察二叉搜索树,root左边的结点都是小于它的,root右边的结点都是大于它的,发现了这个规律之后,递归就很好解决了,每个节点下面的左孩子 群都小于它,下面的右孩子群都大于它,这就符合递归性质了;
首先我们取最右边那个根结点(5),第一轮while语句直到找到比它小的第一个数,而这个数就是它的左孩子(3),
这个时候就可以发现,3左边的全是它的孩子,7左边一直到3的数组全是它的孩子,这样又可以把3和7单独看成根结点继续递归判断;
总结:递归让二叉树问题变得更加简单!