这个题目按照我们一般的思路来说比较容易做,就是求出两个子树的长度,如果满足平衡的条件则递归的判断各自的子树,否则返回false,代码如下:
public class Solution {
public boolean IsBalanced_Solution(TreeNode root) {
if (root == null) //为null,则返回true
return true;
if(Math.abs(Depth(root.left)-Depth(root.right)) < 2) //若当前满足,递归判断左右子树
return IsBalanced_Solution(root.left) && IsBalanced_Solution(root.right);
return false; //否则当前不满足,直接返回false
}
//求一棵树的高度
private int Depth(TreeNode root) {
if (root == null)
return 0;
return Math.max(Depth(root.left), Depth(root.right)) + 1;
}
}
但是其实这个思路是有缺点的,就是我们会做很多额外的工作,也就是在求高度的时候我们会重复去求某一棵树的高度。那么我们可不可以在求树的高度的时候就直接判断呢,当然是可以的,代码如下:
public class Solution {
public boolean IsBalanced_Solution(TreeNode root) {
return Depth(root) != -1;
}
private int Depth(TreeNode root) {
if (root == null) return 0;
int leftDepth = Depth(root.left);
int rightDepth = Depth(root.right);
//多了个判断条件,即得到两个子树的高度就立即判断是否平衡
if (leftDepth == -1 || rightDepth == -1 || Math.abs(leftDepth-rightDepth)>1)
return -1;
else
return Math.max(leftDepth, rightDepth)+1;
}
}
能看出来,递归的时候当求得左右子树的高度时,不是立即返回两者的最大值+1,而是先判断一下当前是否满足平衡二叉树特点,满足则返回两者最大值+1,否则返回-1来标识树是不平衡的。