剑指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) ...
随机推荐
- 通过自动回复机器人学Mybatis:原始版本(包括JDBC、pom.xml等)
imooc视频学习笔记 ----> URL:http://www.imooc.com/learn/154 list.jsp <%@ page contentType="text/ ...
- Tomcat 线程池配置
线程池 Executor代表了一个线程池,可以在Tomcat组件之间共享.使用线程池的好处在于减少了创建销毁线程的相关消耗,而且可以提高线程的使用效率.要想使用线程池,首先需要在 Service标签中 ...
- python 利用PIL库进行更改图片大小的操作
python 是可以利用PIL库进行更改图片大小的操作的,当然一般情况下是不需要的,但是在一些特殊的利用场合,是需要改变图片的灰度或是大小等的操作的,其实用python更改图片的大小还是蛮简单的,只需 ...
- 在Windows Server 2008 R2上打开ping的方法
默认安装完Windows Server 2008 R2后,从外面ping服务器的地址是ping不通的,原因是服务器防火墙默认关闭了ICMP的回显请求.需要按照如下方法打开: 在服务器管理器中选择“配置 ...
- git提交出现remote rejected master -> XX changes closed
问题现象: 提交git的时候出现 ! [remote rejected] master -> refs/for/master (change http://XXXX.com/myreview/c ...
- windows 下android react native详细安装配置过程
写在前面: 在网上搜了很多安装配置文档,感觉没有一个真的跟我安装的过程一模一样的,东拼拼西凑凑,总算是装好了,我不会告诉你,断断续续,我花了两天时间...一到黑屏报错就傻眼,幸好在react群里遇到了 ...
- 关于在asp.net添加jQuery的智能提示
如果是vs2008以后的版本,一般都会支持jQuery自动提示代码功能,不支持也没关系,很简单的操作就能支持: 1.先为vs下载一个补丁,地址为:http://code.msdn.microsoft. ...
- adplayer移植【转】
本文转载自:https://blog.csdn.net/qq361294382/article/details/50525412 这两天做madplayer移植,由于是刚装的ubuntu14.04,所 ...
- <关于并发框架>Java原生线程池原理及Guava与之的补充
原创博客,转载请联系博主! 转眼快两个月没有更新自己的博客了. 一来感觉自己要学的东西还是太多,与其花几个小时写下经验分享倒不如多看几点技术书. 二来放眼网上已经有很多成熟的中文文章介绍这些用法,自己 ...
- eclipse部署的web项目没有添加到Tomcat的webapps目录下解决方法
eclipse没有像myeclipse那样,添加web项目时会自动部署到Tomcat的webapps目录下. 而是部署到了eclipse的.metadata\.plugins\org.eclipse. ...