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