110 - 平衡二叉树 - python

45 阅读1分钟

给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1

示例 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。因此,高度差的问题可以转换为深度差,根据104 - 二叉树的最大深度 - python中递归求解二叉树深度的思路,我们可以依次判断子树的深度差来决定是否满足高度平衡的要求。

class Solution:
    def isBalanced(self, root: TreeNode) -> bool:
        # 求解二叉树深度
        def depth(root):
            if root is None:
                return 0
            return max(depth(root.left), depth(root.right)) + 1
        
        if root is None:
            return True
            
        return self.isBalanced(root.left) and self.isBalanced(root.right) and abs(depth(root.left) - depth(root.right)) <= 1

官方题解中还给出了自底向上递归求解问题的思路:

  • 首先判断子树是否平衡
  • 然后通过比较子树高度判断对应的父节点是否平衡

这样做可以避免大量冗余的计算。

class Solution:
    def isBalancedHelper(self, root: TreeNode) -> (bool, int):
        if not root:
            return True, -1
            
        # 先判断左右子树
        leftIsBalanced, leftHeight = self.isBalancedHelper(root.left)
        if not leftIsBalanced:
            return False, 0
            
        rightIsBalanced, rightHeight = self.isBalancedHelper(root.right)
        if not rightIsBalanced:
            return False, 0
            
        # 再判断左右子树对应的父节点
        return (abs(leftHeight - rightHeight) < 2), 1 + max(leftHeight, rightHeight)
        
    def isBalanced(self, root: TreeNode) -> bool:
        return self.isBalancedHelper(root)[0]