- 他人解法:对于每棵子树来说,它都应该是一颗平衡树,那么就自底向上开始判断,只要有一颗不是,就直接返回结果。巧妙的地方来了,我们并不直接返回布尔值,而是返回当前数的高度,我们知道一棵树的高度是
max(左子树高度,右子树高度)+1
,我们先得到左右子树高度,因为要平衡,所以我们判断如果左右子树高度差小于 2 ,那么返回树的高度,否则就返回 -1,代表当前子树不平衡。 -
public boolean isBalanced(TreeNode root) {
return recur(root)!=-1;
}
public int recur(TreeNode root){
if(root==null)return 0;
int left = recur(root.left);
if(left == -1)return -1;
int right = recur(root.right);
if(right == -1)return -1;
return Math.abs(left-right)<2?Math.max(left,right)+1:-1;
}
- 根据以上代码左右根这种后序遍历,其实他会先遍历到最左的叶子节点,然后此时该叶节点左右节点都为 null,所以左右子树高度都为 0,那么它的左右子树高度差当然小于 2,所以返回了该叶子节点高度为 1,然后继续往上递推…
- 当然,我们都知道求一棵树的高度是如下
-
int depth(TreeNode root) {
if (root == null) return 0;
return Math.max(depth(root.left), depth(root.right)) + 1;
}
- 所以如果你纯暴力解决的话,就可以遍历每个节点作为根节点,然后判断左右子树高度差是否小于 2,
-
public boolean isBalanced(TreeNode root) {
if (root == null) return true;
return Math.abs(depth(root.left) - depth(root.right)) <= 1
&& isBalanced(root.left) && isBalanced(root.right);
}
private int depth(TreeNode root) {
if (root == null) return 0;
return Math.max(depth(root.left), depth(root.right)) + 1;
}