// 定义一个内部类,用于封装每棵子树应该返回给原树
class returnData {
boolean isBalanced; // 子树是否是平衡二叉树
int height; // 子树的高度是多少
returnData(boolean isBalanced, int height) { // 构造函数
this.isBalanced = isBalanced;
this.height = height;
}
}
public boolean IsBalanced_Solution(TreeNode root) {
if (null == root) {
return true;
}
if (null == root.left && null == root.right) {
return true;
}
// 调用递归函数
returnData rs = IsBalanced(root);
return rs.isBalanced;
}
// 判断一棵树是否是平衡二叉树的具体实现
public returnData IsBalanced(TreeNode root) {
if (null == root) {
return new returnData(true, 0); // 如果空节点,那么这棵树是平衡二叉树,高度为 0
}
returnData leftData = IsBalanced(root.left); // 获取左子树的信息
returnData rightData = IsBalanced(root.right); // 获取右子树的信息
// 只有满足左右子树均是平衡二叉树,且左右子树的高度差小于 2 的情况下,这棵树才是平衡二叉树
boolean isBalanced = leftData.isBalanced && rightData.isBalanced && Math.abs(leftData.height - rightData.height) < 2;
return new returnData(isBalanced, Math.max(leftData.height, rightData.height) + 1); // 别忘了,当前树的高度是左右子树中高度最大的那棵树的高度 + 1!!!
}
}