题目: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-第六章面试中的各项能力(二叉树的深度)的更多相关文章

  1. 剑指offer-第六章面试中的各项能力(圆圈中剩下的最后数字)

    import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util ...

  2. 剑指offer-第六章面试中的各项能力(扑克牌中的顺子)

    //扑克牌的顺子 //题目:在一个扑克牌中随机的抽5张牌,看是不是顺子.大小王为0,A为1,J为11,Q为12,K为13.其他数字为自己本身. //思路:大小王可以代表任意一个数字,因此我们在看是不是 ...

  3. 剑指offer-第六章面试中的各项能力(n个骰子的点数)

    题目:把n个骰子扔到地上,骰子之和为S,输入n,打印s所有可能的值出现的概率. 思路:由于骰子的点数为1~6,因此n个骰子之和的大小为n~6n之间.故可以定义一个数组来存放这6n-n+1个数出现的次数 ...

  4. 剑指offer-第六章面试中的各项能力(和为S的两个数字VS和为S的连续正序列)

    题目1:输入一个排序数组和一个值S,输出数组中两个数的和为S的任意一对数. 思路:分别用两个指针指向数组的头start和尾end.如果两个数字之和等于S输出.如果打于,则end--,再次相加.因此循环 ...

  5. 剑指offer-第六章面试中的各项能力(数组中只出现一次的数字)

    题目:输入一个数组,该数组中有两个只出现一次的数字,其他的数字都出现两次,输出出只出现一次的数字. 思路:首先,我们可以将这个数组分成两份,一份里面放一个只出现一次的数字.那么我们该怎么分呢?将整个数 ...

  6. 剑指offer-第六章面试中的各项能力(数字在排序数组中出现的次数)

    题目:统计一个数字在排序数组中出现的次数. 思路:采用二分查找,找到该数字在数组中第一次出现的位置,然后再找到组后一个出现的位置.两者做减法运算再加1.时间复杂度为O(logn) Java代码: // ...

  7. 剑指offer-第六章面试中的各项能力之总结

  8. 剑指offer-第六章面试中的各项能力(不用加减乘除做加法)

    //不用加减乘除四则运算,来做加法 //题目:两个数做加法. //思路:用二进制的位运算的思路.第一步:首先两数相加考虑进位.可以用异或. //第二步:两个数相加只考虑进位,并将最后的结果左移.第三步 ...

  9. 剑指offer-第六章面试中的各项能力(翻转单词的顺序VS左旋转字符串)

    //题目1:翻转单词顺序例如“Hello world!”翻转后为world! Hello. //思路:首先翻转整个字符串,然后再分别翻转每个单词. //题目2:左旋转字符串,是将字符串的前面几个(n) ...

随机推荐

  1. Windows 下c获取文件目录

    由于要插数据库,构建sql语句,需要文件名,在网上找了半天,无奈都是Linux下的专用函数,伤心,,还有那个下载URL ,还木搞好,就要走啦,心焦哇 #include<iostream> ...

  2. Python面试题之Python和Java中Super方法的区别

    python 的 super 是一个函数,需要两个参数,第一个参数是类,第二个参数是实例,返回值是一个类对象. 其意义是:站在参数2这个实例的角度看去, 参数1这个类的‘父亲’是谁,把‘父亲’返回. ...

  3. Maven的Mirror和Repository

    今天新公司入职,项目经理让迁出项目,心想maven的阿里镜像源挺快的,干脆在配置了公司私服之后自己配置了阿里的镜像源,没成想项目屡屡报错,找不到项目依赖的公司jar包,后来才发现,同事配置mirror ...

  4. Linux网络配置脚本

    #!/bin/bash ip=$1 if [ -f "/etc/sysconfig/network-scripts/ifcfg-bond1" ] then break else # ...

  5. VRChat简易教程1-开发环境准备(SDK)

    原文:https://docs.vrchat.com/docs/setting-up-the-sdk 1 Unity 2017.4.15f1 下载地址https://download.unity3d. ...

  6. elasticsearch 拼音搜索

    现在很多公司都开始使用es来做搜索,我们公司目前也有好几个业务部门在用,我主要做商户搜索,为业务部门提供基础支持.上周把呼叫中心的搜索重新整理了下,在新增几个字段后,全量同步发现通过拼音首字母搜索无法 ...

  7. XP_SP3_专业汉化版__x86_cd_x14-80404

    1.镜像文件: zh-hans_windows_xp_professional_with_service_pack_3_x86_cd_x14-80404.iso 来自 msdn itellyou 2. ...

  8. 为什么Kubernetes不使用libnetwork

    Kubernetes 在 1.0 版本之前就已经有了最初的网络插件.与此同时 Docker 也引入了 libnetwork 和 Container Network Model (CNM).现在 Doc ...

  9. Prism技术开发文档(五星级)

    转自csdn博客园:http://blog.csdn.net/albert528108/article/details/52122547

  10. .net操作Oracle数据库步骤及方法

    1.首先安装PL/SQL Developer Oracle客户端软件 2.安装Oracle Instant Client(即时客户端) 安装与配置 配置环境变量ORAClE HOME 地址为insta ...