/**
* 问题:判断一棵树是否是平衡二叉树。
* 解:平衡二叉树要求所有左右子树的高度相差不会超过1,所以算法的核心是递归。
*/public class BalancedBinaryTree {
// 内部节点类
public class TreeNode {
int val; // 节点的关键字
TreeNode left; // 左孩子
TreeNode right; // 右孩子
// 构造函数
TreeNode(int val) {
this.val = val;
}
}public boolean isBalance(TreeNode root) {
// 空判断
if (root == null)
return true;
// 先看根节点的左右子树是否平衡
int leftHeight = getTreeHeight(root.left);
int rightHeight = getTreeHeight(root.right);
if (Math.abs(leftHeight - rightHeight) > 1)
return false;
// 递归判断左子树是否平衡
if (root.left != null) {
if (isBalance(root.left) == false)
return false;
}
// 递归判断右子树是否平衡
if (root.right != null) {
if (isBalance(root.right) == false)
return false;
}
return true;
}public int getTreeHeight(TreeNode node){
// 空判断
if (node == null)
return 0;
// 到达叶子节点时递归结束
if (node.left == null && node.right == null)
return 1;
// 递归计算左右子树的高度
int leftHeight = getTreeHeight(node.left);
int rightHeight = getTreeHeight(node.right);
// 比较的是子树的高度,而返回的是当前节点的高度,易漏 +1。
return (leftHeight >= rightHeight) ? leftHeight+1 : rightHeight+1;
}}