问题描述
给定一颗二叉树,找到最长连续路径的长度,即任何序列起始节点到树中任一节点都必须遵循父子关系,最长连续路径必须是从父节点到子节点
示例
输入:{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