【刷题笔记】110. 平衡二叉树

77 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第6天,点击查看活动详情

一、题目描述:

110. 平衡二叉树 - 力扣(LeetCode) (leetcode-cn.com)

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

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

 

示例 1: image.png

输入:root = [3,9,20,null,null,15,7]
输出:true

示例 2:

image.png

输入:root = [1,2,2,3,3,null,null,4,4]
输出:false

示例 3:

输入:root = []
输出:true

提示:

  • 树中的节点数在范围 [0, 5000] 内
  • -10^4 <= Node.val <= 10^4

二、思路分析:

  1. 自底向顶 对二叉树做先序遍历,自底向顶依次计算每一点的最大高度(前提是这一点为根节点的子树平衡)

    如果在回溯过程中,发现某一子树不平衡,直接提前返回-1

  2. 从顶至底(会有大量重复运算) 先构造一个函数获取当前节点最大深度,对每一点进行判断时,先计算左右子树高度差是否小于2,再去判断左右子树是否平衡,当三者都成立时,以当前探索节点为根节点的子树平衡。

三、AC 代码:

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
#自底向顶
    def isBalanced(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        def recur(root):
            if not root: return 0
            left = recur(root.left)
            if left == -1: return -1
            right = recur(root.right)
            if right == -1: return -1
            return max(left, right) + 1 if abs(left - right) < 2 else -1

        return recur(root) != -1
#从顶至底
    def isBalanced(self, root: TreeNode) -> bool:
        if not root: return True
        return abs(self.depth(root.left) - self.depth(root.right)) <= 1 and \
            self.isBalanced(root.left) and self.isBalanced(root.right)

    def depth(self, root):
        if not root: return 0
        return max(self.depth(root.left), self.depth(root.right)) + 1

范文参考:

Java自底向上的小白代码-套用求二叉树深度的模板 - 平衡二叉树 - 力扣(LeetCode)