链接:https://leetcode.cn/problems/balanced-binary-tree/
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 :::info 示例 1:
给定二叉树 [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
返回 true 。

示例 2:
给定二叉树 [1,2,2,3,3,null,null,4,4]
1
/ \
2 2
/ \
3 3
/ \
4 4
返回 false 。 :::

思路

解法一

要满足一个树是平衡二叉树,它的子树也必须是平衡二叉树。我们可以从根结点开始,通过递归来求得子树的高度,以及子树是否是平衡二叉树,以此来结合判断二叉树是否是平衡二叉树。

  1. var isBalanced = function(root) {
  2. if (!root) return true;
  3. let isSonBalanced = Math.abs(getHeight(root.left) - getHeight(root.right)) <= 1;
  4. return isSonBalanced && isBalanced(root.left) && isBalanced(root.right);
  5. };
  6. const getHeight = (node) => {
  7. if (!node) return 0;
  8. return Math.max(getHeight(node.left), getHeight(node.right)) + 1
  9. }

解法二

在解法一中,自顶向下地计算子树高度,这样导致了每层的高度都要重复计算。
为了解决这个问题,我们可以采用后续遍历的方法去求解,这样每个节点的高度就能根据前面的结果算出来。

  1. var isBalanced = function(root) {
  2. return getHeight(root) !== -1;
  3. };
  4. const getHeight = (node) => {
  5. if (!node) return 0;
  6. const left = getHeight(node.left);
  7. const right = getHeight(node.right);
  8. if (left === -1 || right === -1 || Math.abs(left - right) > 1) {
  9. return -1;
  10. }
  11. return Math.max(left, right) + 1;
  12. }