Python实现二叉树最长序列

问题描述

给定一颗二叉树,找到最长连续路径的长度,即任何序列起始节点到树中任一节点都必须遵循父子关系,最长连续路径必须是从父节点到子节点

示例

输入:{1,#,3,2,4,#,#,5}
输出:3

代码实现

import queue
class TreeNode:
    #树节点类
    def __init__(self,val):
        "每个节点有自身的值和左右节点"
        self.val=val
        self.left=None
        self.right=None
class Tree:
    """
    二叉树类
    """
    def __init__(self,tree_str):
        #通过树的表示字符串,生成一颗二叉树
        #构造一个队列
        q=queue.Queue()
        #将序列化的符号加入队列
        tree_list=tree_str.strip()[1:-1].split(",")
        for s in tree_list:
            q.put(s)
        #构造根节点
        self.root=TreeNode(int(q.get()))

        #nodes记录每层节点的信息
        nodes=[self.root]

        #循环执行,直到队列里没有符号
        while not q.empty():
            curr_nods=[]
            #如果队列里剩余元素数量不足nods里记录数量的两倍
            if q.qsize()<len(nodes)*2:
                raise RuntimeError(f"描述字符错误{tree_str}")
            #从队列中弹出构造下一层的符号
            for i in range(len(nodes) * 2):
                c=q.get()
                #如果不是#号,创建树节点
                if c !='#':
                    node=TreeNode(int(c))

                    #记录到当前节点的集合中
                    curr_nods.append(node)
                    #将生成的新节点,加入到对应字节的位置
                    if i % 2==0:
                        nodes[i // 2].left=node
                    if i % 2!=0:
                        nodes[i // 2].right=node
            #当前层节点记录,继续循环生成下一层树节点
            nodes = curr_nods
#从root根节点开始,计算深度
def longestConsecytive( root):
    return helper(root,None,0)
def helper(root,parent,lens):
   """
   计算当前子树节点的深度
   :param root:当前子树得根节点
   :param parent:父节点
   :param lens:父节点得连续深度
   :return:
   """
   #当前节点子树根为None,说明这是一个空节点,深度为父节点的深度
   if root is None:
       return lens
   #如果当前子树不为空,并且父节点不为空,需要将深度加1,否则深度初始化为1
   if parent is not None and root.val==parent.val+1:
       lens+=1
   else:
       lens=1
   #递归调用
   return max(lens,max((helper(root.left,root,lens)),(helper(root.right,root,lens))))
if __name__=='__main__':
    num='{1,#,3,2,4,#,#,#,5}'
    print("输入为:",num)
    tree=Tree(num)
    print("输出为:",longestConsecytive(tree.root))

运行结果

输入为: {1,#,3,2,4,#,#,#,5,6,7}
输出为: 4
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SQingL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值