解题思路1:
import java.util.*;
public class Solution {
public boolean IsBalanced_Solution(TreeNode root) {
if(root == null){
return true;
}
//判断两个子树的高度差绝对值是否超过1
if(Math.abs(getTreeDeep(root.left) - getTreeDeep(root.right)) > 1){
return false;
}
return IsBalanced_Solution(root.left) && IsBalanced_Solution(root.right);
}
//计算二叉树的深度
public int getTreeDeep(TreeNode root){
if(root == null){
return 0;
}
int leftNum = 1;
int rightNum = 1;
if(root.left != null){
leftNum += getTreeDeep(root.left);
}
if(root.right != null){
rightNum += getTreeDeep(root.right);
}
return leftNum >= rightNum ? leftNum : rightNum;
}
}
解题思路2:
思路1的作法有明显的问题,在判断上层结点的时候,会多次重复遍历下层结点,增加了不必要的开销。如果改为从下往上遍历,如果子树是平衡二叉树,则返回子树的高度;如果发现子树不是平衡二叉树,则直接停止遍历,这样至多只对每个结点访问一次。以下是优化方法:
public class Solution {
public boolean IsBalanced_Solution(TreeNode root) {
return getTreeDepth(root) != -1;
}
//如果子树是平衡二叉树则返回子树的高度,否则返回-1
public int getTreeDepth(TreeNode root){
if(root == null){
return 0;
}
int left = getTreeDepth(root.left);
//判断左子树是否是平衡二叉树
if(left == -1){
//不是平衡二叉树
return -1;
}
int right = getTreeDepth(root.right);
//判断右子树是否是平衡二叉树
if(right == -1){
//不是平衡二叉树
return -1;
}
return Math.abs(left - right) > 1 ? -1 : 1 + Math.max(right,left);
}
}