题目描述
解题思路
首先解释一下,为什么会做到这个题目,因为博主在按顺序做题的过程中,碰到了一个不会做的题目(递归类型),就想着看看题解,发现了一个大佬的文章,就是专门讲的递归,里面包含了这个例子。就想着用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