题目描述
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
对于这个问题,一棵高度平衡的二叉树的定义是:一棵二叉树中每个节点的两个子树的深度相差不会超过1。
样例
给出二叉树 A={3,9,20,#,#,15,7} , B={3,#,20,15,7}
二叉树A是高度平衡的二叉树,但是B不是
分析
首先求深度,然后判断深度相差是否超过1,注意递归的使用
思路:遍历每个结点,借助一个获取树深度的递归函数,根据该结点的左右子树高度差判断是否平衡,然后递归地对左右子树进行判断。
代码
public class Solution {
public boolean IsBalanced_Solution(TreeNode root) {
if(root==null)
return true;
int left=depth(root.left);
int right=depth(root.right);
if(Math.abs(left-right)<=1){//如果左右子树高度差大于1,则说明不是二叉平衡二叉树
return IsBalanced_Solution(root.left)&&IsBalanced_Solution(root.right);
}
else{
return false;
}
}
//判断二叉树的深度
public int depth(TreeNode root){
if(root==null){
return 0;
}
int left=depth(root.left);
int right=depth(root.right);
return Math.max(left,right)+1;
}
}
上面的做法有很明显的问题,在判断上层结点的时候,会多次重复遍历下层结点,增加了不必要的开销。
改进:如果改为从下往上遍历,如果子树是平衡二叉树,则返回子树的高度;如果发现子树不是平衡二叉树,则直接停止遍历,这样至多只对每个结点访问一次。
public class Solution {
boolean IsBalanced=true;
public boolean IsBalanced_Solution(TreeNode root) {
depth(root);
return IsBalanced;//默认IsBalanced=true,发现不平衡树就返回false
}
public int depth(TreeNode root){
if(root==null){
return 0;
}
int left=depth(root.left);
int right=depth(root.right);
if(Math.abs(left-right)>1){//发现不平衡树就返回IsBalanced=false
IsBalanced=false;
}
return right>left? right+1:left+1;
}
}
参考:简书 LintCode 平衡二叉树