leetcode刷题-110 平衡二叉树的判断(递归实现)

文章讲述了如何使用Python递归方法判断一个二叉树是否为平衡二叉树,通过计算左右子树的深度差来确定,同时引入了新的结构体来存储深度和平衡状态。作者详细解释了递归过程和代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

在这里插入图片描述

解题思路

首先解释一下,为什么会做到这个题目,因为博主在按顺序做题的过程中,碰到了一个不会做的题目(递归类型),就想着看看题解,发现了一个大佬的文章,就是专门讲的递归,里面包含了这个例子。就想着用python实现一下。进入正题。
首先,我们通常通过左右子树的高度差来判断该树是否是平衡二叉树,如果二叉树的高度差大于1,那么我们判断这个树不是平衡二叉树,反之,为平衡二叉树。知道这个思路那这个题目我们想象怎么用递归解决。
语言描述加上伪代码可能更容易表述。
1.首先空树是平衡二叉树,这个也是递归的终止条件。
我们可以这样写:

def isNB(root):
      if root==None:
         return ReturnNode(True,0)

2.接着是判断左右子树是否是平衡二叉树,代码又变成这样

def isNB(root):
      if root==None:
         return True
      left=isNB(root.left)
      right=isNB(root.right)

3.接下来,我们要考虑一个问题,对于当前子问题,只包含三个节点,根,左子树,右子树,我们根据其深度判断是否是平衡二叉树。原本的类中,只包含,左右子树,节点的值。不能满足我们的需要。此时我们需要重新定义一个结构体,此结构体,能够在递归的同时实现是否是平衡二叉树的判断,又能实现深度的计算。
定义新的类如下:

class ReturnNode:
    def __init__(self,isbalance=True,depth=0,):
        self.isbalance=isbalance
        self.depth=depth

那么之前写的代码就变成了这样

def isNB(root):
    if root==None:
        return ReturnNode(True,0)
    left=isNB(root.left)
    right=isNB(root.right)

接下来,我们需要考虑三个节点是否平衡,左右节点是否平衡,可以通过isbalance属性判断,当前节点的判断,需要凭借左右节点的深度值之差。代码如下。

def isNB(root):
    if root==None:
        return ReturnNode(True,0)
    left=isNB(root.left)
    right=isNB(root.right)
    if not right.isbalance:
        return ReturnNode(False,0)
    if not left.isbalance:
        return ReturnNode(False,0)
    if abs(left.depth-right.depth)<=1:
        return ReturnNode(True,max(left.depth,right.depth)+1)
    else:
        return ReturnNode(False,0)

大家可以看到在递归的同时,也实现了当前节点深度值的计算。

leetcode实现代码如下

# 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 ReturnNode:
    def __init__(self,isbalance=True,depth=0,):
        self.isbalance=isbalance
        self.depth=depth
class Solution:
    def isNB(root):
        if root==None:
            return ReturnNode(True,0)
        left=isNB(root.left)
        right=isNB(root.right)
        if not right.isbalance:
            return ReturnNode(False,0)
        if not left.isbalance:
            return ReturnNode(False,0)
        if abs(left.depth-right.depth)<=1:
            return ReturnNode(True,max(left.depth,right.depth)+1)
        else:
            return ReturnNode(False,0)


    def isBalanced(self, root: Optional[TreeNode]) -> bool:
        def isNB(root):
            if root==None:
                return ReturnNode(True,0)
            left=isNB(root.left)
            right=isNB(root.right)
            if not right.isbalance:
                return ReturnNode(False,0)
            if not left.isbalance:
                return ReturnNode(False,0)
            if abs(left.depth-right.depth)<=1:
                return ReturnNode(True,max(left.depth,right.depth)+1)
            else:
                return ReturnNode(False,0)
        return isNB(root).isbalance
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值