题目
给定一个二叉树,判断它是否是高度平衡的二叉树
题目补充
高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
思路
方法一:
如果在刚写完二叉树的深度的情况下,应该很容易能联想到。只要分别求两棵子树的深度,再比较一下它们的差值,如果不超过1,那么这棵二叉树就是高度平衡的二叉树了。
方法二:
方法一会有一种弊端,例如:
这棵二叉树我们从肉眼能看出它 相当不平衡
了,但是代码仍然需要遍历完全部节点才能知道结果,会造成很多的浪费。所以我们需要提前终止递归。
方法一是一种至上而下的遍历方法,方法二我们采用自下而上的遍历方法。
如果我们发现有一棵子树已经不是高平衡二叉树了,那么就终止递归。
代码实现
方法一
/**
* 平衡二叉树 从顶至底 比较暴力
* @param root
* @return
*/
public boolean isBalanced(TreeNode root) {
if(root == null) return true;
int leftDepth = maxDepth(root.left); //获得左孩子深度
int rightDepth = maxDepth(root.right); //获得右子树深度
//如果深度差大于1返回false 进行递归判断左右孩子的深度差
return Math.abs(leftDepth-rightDepth) > 1 ? false:true && isBalanced(root.left) &&isBalanced(root.right);
}
方法二
/**
* 平衡二叉树 从底至顶 效率最好
* @param root
* @return
*/
public boolean isBalanced(TreeNode root){
return recur(root) != -1;
}
private int recur(TreeNode root){
if(root == null) return 0; //如果根节点为null,递归结束,当前节点深度为0
int leftDepth = recur(root.left); //递归 获得当前节点左孩子的深度
if(leftDepth == -1) return -1; //发现左子树已经为非平衡,提前结束递归
int rightDepth = recur(root.right); //递归 获得当前节点右孩子的深度
if(rightDepth == -1 ) return -1; //发现右子树已经为非平衡,提前结束递归
//判断左子树和右子树的深度差,若不是平衡二叉树,返回-1;否则返回二叉树深度
return Math.abs(leftDepth-rightDepth) > 1 ? -1 : Math.max(leftDepth,rightDepth) + 1;
}
总结
第一次能很快的写出暴力递归了,蛮兴奋的,但是写的时候也会觉得:诶?感觉时间复杂度好高咧。和之前的题很像但也不是一种算法,很妙,多多学习。