剑指offer-第六章面试中的各项能力(二叉树的深度)
题目:1:输入一个二叉树,求二叉树的深度。从根节点开始最长的路径。
思路:我们可以考虑用递归,求最长的路径实际上就是求根节点的左右子树中较长的一个然后再加上1.
题目2:输入一颗二叉树的根节点,判断该二叉树是不是平衡二叉树。平衡二叉树是这样的数,每一个节点左右子树的深度差不超过1.
思路1:从根节点开始判断,左右子树的节点的深度是否是相差1的。然后递归判断下面的节点。
思路2:采用后序遍历,判断左右子树是否相差不超过1,记住每次左右子树的深度。最后判断根节点是否是平衡的。这样做的好处是避免了重复遍历好多节点。从下到上。每个节点只遍历一次。
Java代码:
//二叉树的深度,可以求得左右子树中较大的那个值加上1即可
public class BiTreeDeepth {
public class BiTreeNode{
int m_nValue;
BiTreeNode m_pLeft;
BiTreeNode m_pRight;
}
public BiTreeNode createBiTree(int[] pre,int start,int[] ord,int end,int length){
if(pre.length!=ord.length||pre==null||ord==null||length<=0)
return null;
int value=pre[start];
BiTreeNode root=new BiTreeNode();
root.m_nValue=value;
root.m_pRight=root.m_pLeft=null;
if(length==1){
if(pre[start]==ord[end])
return root;
else
throw new RuntimeException("inVaild put");
}
//遍历中序遍历的序列找到根节点
int i=0;
while(i<length){
if(ord[end-i]==value)
break;
i++;
}
int right=i;
int left=length-i-1;
if(left>0)
root.m_pLeft=createBiTree(pre,start+1,ord,end-i-1,length-i-1);
if(right>0)
root.m_pRight=createBiTree(pre,start+length-i,ord,end,i);
return root;
}
//求二叉树的深度
public int treeDepth(BiTreeNode pHead){
if(pHead==null)
return 0;
int left=treeDepth(pHead.m_pLeft);
int right=treeDepth(pHead.m_pRight);
return (left>right)?left+1:right+1; }
//判断二叉树是不是平衡二叉树,平衡二叉树是指在二叉树中任意节点的左右子树的深度不超过1
boolean isBlance(BiTreeNode pHead){
if(pHead==null)
return true;
int left=treeDepth(pHead.m_pLeft);
int right=treeDepth(pHead.m_pRight);
int dif=left-right;
if(dif>1||dif<-1)
return false;
return isBlance(pHead.m_pLeft)&&isBlance(pHead.m_pRight);
}
//判断二叉树是不是平衡二叉树,采用后序遍历的思路,不用遍历重复的节点
boolean isBlance1(BiTreeNode pHead){
if(pHead==null)
return true;
int[] a=new int[1];
a[0]=0;
return isBlanced(pHead,a); }
public boolean isBlanced(BiTreeNode pHead, int[] a) {
if(pHead==null){
a[0]=0;
return true;
}
int[] left=new int[1];
int[] right=new int[1];
if(isBlanced(pHead.m_pLeft,left)&&isBlanced(pHead.m_pRight,right)){
int dif=left[0]-right[0];
if(dif>=-1&&dif<=1){
a[0]=1+((left[0]>right[0])?left[0]:right[0]);
return true;
} }
return false;
} public static void main(String[] args) {
int pre[] = {1, 2, 4, 7, 3, 5, 6, 8}; int ord[] = {4, 7, 2, 1, 5, 3, 8, 6};
BiTreeDeepth btd=new BiTreeDeepth();
BiTreeNode pHead=btd.createBiTree(pre, 0, ord, pre.length-1, pre.length);
int depth=btd.treeDepth(pHead);
System.out.println(depth);
boolean isBlanced=btd.isBlance(pHead);
boolean isBlanced1=btd.isBlance1(pHead);
System.out.println(isBlanced+""+isBlanced1); }
}
剑指offer-第六章面试中的各项能力(二叉树的深度)的更多相关文章
- 剑指offer-第六章面试中的各项能力(圆圈中剩下的最后数字)
import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util ...
- 剑指offer-第六章面试中的各项能力(扑克牌中的顺子)
//扑克牌的顺子 //题目:在一个扑克牌中随机的抽5张牌,看是不是顺子.大小王为0,A为1,J为11,Q为12,K为13.其他数字为自己本身. //思路:大小王可以代表任意一个数字,因此我们在看是不是 ...
- 剑指offer-第六章面试中的各项能力(n个骰子的点数)
题目:把n个骰子扔到地上,骰子之和为S,输入n,打印s所有可能的值出现的概率. 思路:由于骰子的点数为1~6,因此n个骰子之和的大小为n~6n之间.故可以定义一个数组来存放这6n-n+1个数出现的次数 ...
- 剑指offer-第六章面试中的各项能力(和为S的两个数字VS和为S的连续正序列)
题目1:输入一个排序数组和一个值S,输出数组中两个数的和为S的任意一对数. 思路:分别用两个指针指向数组的头start和尾end.如果两个数字之和等于S输出.如果打于,则end--,再次相加.因此循环 ...
- 剑指offer-第六章面试中的各项能力(数组中只出现一次的数字)
题目:输入一个数组,该数组中有两个只出现一次的数字,其他的数字都出现两次,输出出只出现一次的数字. 思路:首先,我们可以将这个数组分成两份,一份里面放一个只出现一次的数字.那么我们该怎么分呢?将整个数 ...
- 剑指offer-第六章面试中的各项能力(数字在排序数组中出现的次数)
题目:统计一个数字在排序数组中出现的次数. 思路:采用二分查找,找到该数字在数组中第一次出现的位置,然后再找到组后一个出现的位置.两者做减法运算再加1.时间复杂度为O(logn) Java代码: // ...
- 剑指offer-第六章面试中的各项能力之总结
- 剑指offer-第六章面试中的各项能力(不用加减乘除做加法)
//不用加减乘除四则运算,来做加法 //题目:两个数做加法. //思路:用二进制的位运算的思路.第一步:首先两数相加考虑进位.可以用异或. //第二步:两个数相加只考虑进位,并将最后的结果左移.第三步 ...
- 剑指offer-第六章面试中的各项能力(翻转单词的顺序VS左旋转字符串)
//题目1:翻转单词顺序例如“Hello world!”翻转后为world! Hello. //思路:首先翻转整个字符串,然后再分别翻转每个单词. //题目2:左旋转字符串,是将字符串的前面几个(n) ...
随机推荐
- ubuntu开启ROOT用户自动登录教程
ub默认不开root很纠结,虽说是为了安全,但对于linux老鸟,老是sudo烦的很 开root方法: sudo passwd root 输入root密码 sudo gedit /etc/gdm/cu ...
- Mysql:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
Mysql:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) Linux: MyS ...
- java连接zookeeper服务器出现“KeeperErrorCode = ConnectionLoss for /test”
昨天调试java连接zookeeper服务器,zookeeper搭建过程在这里不做赘述,在创建连接后,然后操作节点一直报异常 错误信息如下: Exception in thread "mai ...
- 用户iis可以用外网ip访问,用内网访问报错404
如下,没有添加内网ip绑定
- 【JAVA学习】java虚拟机内存配置,-Xss256m -Xms512m -Xmx800m -XX:MaxPermSize=512m
转自:https://blog.csdn.net/a503921892/article/details/39048737 配置tomcat服务器内存大小中的Xms.Xmx.PermSize.MaxPe ...
- Java多线程 - Callable和Future
已知的创建多线程的方法有继承Tread类和实现Runnable方法.此外Java还提供了Callable接口,Callable接口也提供了一个call()方法来做为线程执行体.但是call()方法与r ...
- TCP_AIO_Server_ZC_01
ZC: 这个例子是,1个skt 投递 1个未决的接收操作 1.package aio.Client; 1.1.这是一个 测试的客户端的代码: package aio.Client; import ja ...
- java-ConcurrentLinkedQueue 简单使用
import java.util.concurrent.ConcurrentLinkedQueue; public class CacheTest { /** * * offer(E e) 将指定元素 ...
- KNN 算法,以及与Kmeans的简单对比
KNN与Kmeans感觉没啥联系,但是名字挺像的,就拿来一起总结一下吧. 初学者的总结. KNN是监督学习,Kmeans是无监督学习. KNN用于分类,Kmeans用于聚类. 先说KNN: 对于KNN ...
- spring3: 表达式5.2 SpEL基础
5.1 概述 5.1.1 概述 Spring表达式语言全称为“Spring Expression Language”,缩写为“SpEL”,类似于Struts2x中使用的OGNL表达式语言,能在运行 ...