题目:给定一个二叉树,判断它是否是高度平衡的二叉树。一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
方法1. 自顶向下 (重复递归)
public boolean isBalanced(TreeNode root) {
if (root == null) return true;
// 后根遍历
boolean isLeftBanlanced = isBalanced(root.left);
boolean isRightBanlanced = isBalanced(root.right);
if (!(isLeftBanlanced & isRightBanlanced)) return false; //左右子树不平衡
int leftHigh = getTreeHigh(root.left); // 左子树高
int rightHigh = getTreeHigh(root.right);//右子树高
if (Math.abs(leftHigh - rightHigh) > 1) return false;
return true;
}
public int getTreeHigh(TreeNode root) {
// 返回树高
if (root == null) return 0;
return 1 + Math.max(getTreeHigh(root.left), getTreeHigh(root.right));
}
方法2. 自底向上(优化)
public boolean isBalanced(TreeNode root) {
return getTreeHigh(root) != -1;
}
// 返回树高,计算树高的过程中,判断是否平衡;-1:不平衡;否则,平衡
int getTreeHigh(TreeNode root) {
if (root == null) return 0;
int leftHigh = getTreeHigh(root.left);
if (leftHigh == -1) return -1; //左子树不平衡直接返回, 不能省略这里的提前判断
int rightHigh = getTreeHigh(root.right);
if (rightHigh == -1) return -1; //右子树不平衡直接返回, 不能省略这里的提前判断
//不要像下面执行左右递归之后再判断返回值是不是-1,执行一次判断一次,更好的剪枝
//if (leftHigh == -1 || rightHigh == -1) return -1;
if (Math.abs(leftHigh - rightHigh) > 1) return -1; // root不平衡返回-1
return 1 + Math.max(leftHigh, rightHigh);// 平衡,返回树高
}