• 【LeetCode】687. 最长同值路径


    题目

    687. 最长同值路径

    给定一个二叉树的 root ,返回 最长的路径的长度 ,这个路径中的 每个节点具有相同值 。 这条路径可以经过也可以不经过根节点。

    两个节点之间的路径长度 由它们之间的边数表示。

    示例 1:

    在这里插入图片描述

    输入:root = [5,4,5,1,1,5]
    输出:2
    
    • 1
    • 2

    示例 2:

    在这里插入图片描述

    输入:root = [1,4,5,4,4,5]
    输出:2
    
    • 1
    • 2

    提示:

    • 树的节点数的范围是 [0, 104]
    • -1000 <= Node.val <= 1000
    • 树的深度将不超过 1000

    思路

    • 动态规划, d p [ n o d e ] dp[node] dp[node]表示以node为根,左右子树中最长相同路径长度,则
      d p [ n o d e ] = { 0 n o d e . l e f t . v a l ≠ n o d e . v a l ∧ n o d e . r i g h t . v a l ≠ n o d e . v a l d p [ n o d e . l e f t ] + 1 n o d e . v a l = n o d e . l e f t . v a l ∧ n o d e . v a l ≠ n o d e . r i g h t . v a l d p [ n o d e . r i g h t ] + 1 n o d e . v a l = n o d e . r i g h t . v a l ∧ n o d e . v a l ≠ n o d e . l e f t . v a l max ⁡ ( d p [ n o d e . l e f t ] + 1 , d p [ n o d e . r i g h t ] + 1 ) n o d e . l e f t . v a l = n o d e . r i g h t . v a l = n o d e . v a l dp[node] = \left\{

      0node.left.valnode.valnode.right.valnode.valdp[node.left]+1node.val=node.left.valnode.valnode.right.valdp[node.right]+1node.val=node.right.valnode.valnode.left.valmax(dp[node.left]+1,dp[node.right]+1)node.left.val=node.right.val=node.val" role="presentation" style="position: relative;">0node.left.valnode.valnode.right.valnode.valdp[node.left]+1node.val=node.left.valnode.valnode.right.valdp[node.right]+1node.val=node.right.valnode.valnode.left.valmax(dp[node.left]+1,dp[node.right]+1)node.left.val=node.right.val=node.val
      \right. dp[node]= 0dp[node.left]+1dp[node.right]+1max(dp[node.left]+1,dp[node.right]+1)node.left.val=node.valnode.right.val=node.valnode.val=node.left.valnode.val=node.right.valnode.val=node.right.valnode.val=node.left.valnode.left.val=node.right.val=node.val

    • 结果值则为递归过程中最大的 d p [ n o d e . l e f t ] + n o d e . r i g h t dp[node.left]+node.right dp[node.left]+node.right

    代码

    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, val=0, left=None, right=None):
    #         self.val = val
    #         self.left = left
    #         self.right = right
    class Solution:
        def longestUnivaluePath(self, root: Optional[TreeNode]) -> int:
            ret = 0
            def dfs(node: Optional[TreeNode]) -> int:
                nonlocal ret
                if not node:
                    return 0
                left = dfs(node.left)
                right = dfs(node.right)
                leftLength = left + 1 if node.left and node.val == node.left.val else 0
                rightLength = right + 1 if node.right and node.val == node.right.val else 0
                ret = max(ret, leftLength + rightLength)
                return max(leftLength, rightLength)
            dfs(root)
            return ret
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    复杂度

    • 时间复杂度: O ( n ) O(n) O(n)
    • 空间复杂度: O ( n ) O(n) O(n)
  • 相关阅读:
    35岁程序员被裁员,这半年他的故事
    推荐几款可以转换图片格式的软件
    神经网络 深度神经网络,深度神经网络进展情况
    DJYGUI系列文章八:GDD绘图系统
    树莓派电脑虚拟机3设备连接
    PaddleNLP使用Vicuna
    一些现代 Javascript 技巧
    vite之 import.meta.glob批量引入文件
    分库分表之sharding-proxy
    聊一聊医疗器械的可用性
  • 原文地址:https://blog.csdn.net/apple_50661801/article/details/126655813