返回

浅析LeetCode 110. 平衡二叉树题目的解答及其JavaScript实现

前端

一、平衡二叉树简介

平衡二叉树是一种特殊的二叉树,它满足以下性质:

  • 每个节点的左右子树的高度差至多为1。
  • 树的左右子树也是平衡二叉树。

平衡二叉树具有良好的查找性能,它可以在O(log n)的时间复杂度内完成查找操作。因此,平衡二叉树广泛应用于各种数据结构和算法中。

二、LeetCode 110题:“平衡二叉树”

给定一个二叉树,判断它是否是平衡二叉树。

示例:

给定二叉树 [3,9,20,null,null,15,7]

    3
   / \
  9  20
    /  \
   15   7

返回 true

三、解题思路

解决这个问题的关键在于判断每个节点的左右子树的高度差是否超过1。我们可以使用递归的方式来实现。

  1. 递归定义

对于一个二叉树的节点node,我们定义函数isBalanced(node)来判断该节点的左右子树是否平衡。

  • 如果node为空,则返回true。
  • 否则,计算node的左右子树的高度,并比较这两个高度的差值。
  • 如果差值大于1,则返回false。
  • 否则,递归调用isBalanced函数判断node的左右子树是否平衡。
  1. 递归实现
const isBalanced = (node) => {
  if (node === null) {
    return true;
  }

  const leftHeight = getHeight(node.left);
  const rightHeight = getHeight(node.right);

  if (Math.abs(leftHeight - rightHeight) > 1) {
    return false;
  }

  return isBalanced(node.left) && isBalanced(node.right);
};
  1. 高度计算

为了计算二叉树的高度,我们可以使用另一个递归函数getHeight来实现。

const getHeight = (node) => {
  if (node === null) {
    return 0;
  }

  const leftHeight = getHeight(node.left);
  const rightHeight = getHeight(node.right);

  return Math.max(leftHeight, rightHeight) + 1;
};

四、代码实现

const isBalanced = (node) => {
  if (node === null) {
    return true;
  }

  const leftHeight = getHeight(node.left);
  const rightHeight = getHeight(node.right);

  if (Math.abs(leftHeight - rightHeight) > 1) {
    return false;
  }

  return isBalanced(node.left) && isBalanced(node.right);
};

const getHeight = (node) => {
  if (node === null) {
    return 0;
  }

  const leftHeight = getHeight(node.left);
  const rightHeight = getHeight(node.right);

  return Math.max(leftHeight, rightHeight) + 1;
};

const tree = {
  val: 3,
  left: {
    val: 9,
    left: null,
    right: null,
  },
  right: {
    val: 20,
    left: {
      val: 15,
      left: null,
      right: null,
    },
    right: {
      val: 7,
      left: null,
      right: null,
    },
  },
};

console.log(isBalanced(tree)); // true

五、总结

在本文中,我们详细分析了LeetCode 110题:“平衡二叉树”的解题思路,并提供了用JavaScript语言实现的解决方案。通过本文,你应该已经掌握了判断平衡二叉树的技巧,并能够轻松解决类似的问题。