📜  给定二叉树的最长直线路径长度(1)

📅  最后修改于: 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)$。