110. 平衡二叉树

问题描述

https://leetcode.cn/problems/balanced-binary-tree/description/

解题思路

这题一开始朴素的思路就是,对于每个节点,都计算其是不是平衡二叉树。

计算平衡二叉树的方式是对其求高度。

这会导致我们搜索了2次。

然而我们可以在一次搜索中干这两件事。用-1来标志失衡状态。

当然了,我们也可以通过flag来干这样的事情。

代码

复制代码
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isBalanced(self, root: Optional[TreeNode]) -> bool:
        if root is None:
            return True
        return self.height(root)>=0
    def height(self, root):
        if root is None:
            return 0
        left_height = self.height(root.left)
        right_height = self.height(root.right)
        if left_height == -1 or right_height == -1 or abs(left_height-right_height)>1:
            return -1
        return max(left_height, right_height)+1
复制代码

 用flag来干这样的事情:

复制代码
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isBalanced(self, root: Optional[TreeNode]) -> bool:
        def is_balanced(root):
            if root is None:
                return True, 0
            left_res, left_height = is_balanced(root.left)
            right_res, right_height = is_balanced(root.right)
            return left_res and right_res and abs(left_height-right_height) < 2, max(left_height, right_height) + 1
        return is_balanced(root)[0]
复制代码

 写两个DFS,可再提速,相当于是剪枝了。

复制代码
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def isBalanced(self, root: Optional[TreeNode]) -> bool:
        if root is None:
            return True
        last_res = self.isBalanced(root.left) and self.isBalanced(root.right)
        if not last_res:
            return last_res
        left_height = self.dfs(root.left)
        right_height = self.dfs(root.right)
        return last_res and abs(left_height-right_height)<2
    def dfs(self, root):
        if root is None:
            return 0
        return 1 + max(self.dfs(root.left), self.dfs(root.right))
复制代码

 

posted @   BJFU-VTH  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示