判断二叉树为平衡二叉树python实现


#平衡二叉树:树中任何一个节点它左子树与右子树的高度差不超过1
#利用递归手机信息
# 1 列出可能性 2 整理出返回类型
# 3 整个递归按照同样的结构,得到子树的信息 整合子树
# 的信息、加工出我的信息,往上返回、要求结构一致
class Node(object):
    def __init__(self,val=None):
        self.val = val
        self.left = None
        self.right = None


# def isBalance(root):
#     if not root:
#         return True
#     res = [True]
#     judgeIsBalance(root,1,res)
#     return res[0]
#
# def judgeIsBalance(root,level,res):
#     if not root:
#         return level
#     leftHigh = judgeIsBalance(root.left,level+1,res)
#     if res[0] == False:
#         return level
#     rightHigh = judgeIsBalance(root.right,level+1,res)
#     if res[0] == False:
#         return level
#     if abs(rightHigh-leftHigh)>1:
#         res[0] = False
#     return max(rightHigh,leftHigh)


#返回类型
class ReturnData(object):
    def __init__(self,isB,h):
        self.isB = isB
        self.h = h

def process(head):
    if not head:
        return ReturnData(True,0)
    leftData = process(head.left)
    #leftData的最终返回值类型是上一句的终止条件,因为会遍历到最后
    if not leftData.isB:
        return ReturnData(False,0)
    rightData= process(head.right)
    if not rightData.isB:
        return ReturnData(False,0)
    if abs(leftData.h-rightData.h)>1:
        return ReturnData(False,0)
    return ReturnData(True,max(leftData.h,rightData.h)+1)

def isB(head):
    return process(head).isB

#两个返回语句中的类型规定了递归过后的返回值类型







if __name__ == '__main__':
    head = Node(1)
    head.left = Node(2)
    head.right = Node(3)
    head.left.right = Node(4)
    head.right.right = Node(5)
    a = isB(head)
    print(a)

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值