📅  最后修改于: 2023-12-03 15:41:16.409000             🧑  作者: Mango
给定一棵二叉树,我们定义一条直线路径的长度为直线上的节点数(包括起点和终点)。请你设计一个算法,计算二叉树中最长的相同值直线路径的长度。该路径可能经过根节点,也可能不经过根节点。
示例 1:
输入:
1
/ \
4 5
/ \ \
4 4 5
输出: 2
示例 2:
输入:
1
/ \
4 5
/ \ \
4 4 4
输出: 3
通过一次遍历,利用 DFS 深度优先搜索,实现二叉树的直线路径长度计算。在搜索深度的过程中,需要记录当前路径的深度及长度,并比对叶子节点的值与其祖先节点的值,进而累加路径长度。
class Solution:
def longestUnivaluePath(self, root: TreeNode) -> int:
def dfs(node: TreeNode) -> int:
if not node:
return 0
left_length = dfs(node.left)
right_length = dfs(node.right)
left_arrow = right_arrow = 0
if node.left and node.left.val == node.val:
left_arrow = left_length + 1
if node.right and node.right.val == node.val:
right_arrow = right_length + 1
self.ans = max(self.ans, left_arrow + right_arrow)
return max(left_arrow, right_arrow)
self.ans = 0
dfs(root)
return self.ans
上述代码片段是 Python 语言完成 DFS 深度优先搜索的实现,并在其中判断二叉树的左右子节点与当前节点的值是否相同,如果相同再把深度信息传递下去,统计最长的直线路径长度。时间复杂度为 $O(n)$。