110.给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:true
示例 2:
输入:root = [1,2,2,3,3,null,null,4,4]
输出:false
示例 3:
输入:root = []
输出:true
- 他人解法:对于每棵子树来说,它都应该是一颗平衡树,那么就自底向上开始判断,只要有一颗不是,就直接返回结果。巧妙的地方来了,我们并不直接返回布尔值,而是返回当前数的高度,我们知道一棵树的高度是
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);// 左子树不平衡那就不用继续看了,直接返回 -1if(left == -1)return -1;// 得到右子树高度int right = recur(root.right);// 右子树不平衡那就不用继续看了,直接返回 -1if(right == -1)return -1;// 否则就看看左右子树高度差是否小于 2return 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;// 当前节点作为根节点,左右子树高度差小于等于 1(即当前树为平衡树)// && 左右子树也应该分别为平衡树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;}