返回

力挽狂澜 687_最长同值路径: 难不倒我的技术难点

前端

力挽狂澜 687_最长同值路径: 难不倒我的技术难点

缘起

俗话说得好,看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~ 谁能九层台,不用累土起!

今天给大家带来一道算法题——687_最长同值路径,这道题不仅能考察你的编程能力,更能磨炼你的思维逻辑。快来跟我一起攻克难关吧!

题目地址

题目地址

题目

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

示例 1:

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

示例 2:

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

提示:

  • 树中节点的数目范围是[0, 10^4]
  • -1000 <= Node.val <= 1000

解题思路

这道题的解法有很多种,我们可以采用递归或者深度优先搜索的方法来解决。

递归

def longestUnivaluePath(root):
    if not root:
        return 0

    left = longestUnivaluePath(root.left)
    right = longestUnivaluePath(root.right)

    if root.left and root.left.val == root.val:
        left += 1
    else:
        left = 0

    if root.right and root.right.val == root.val:
        right += 1
    else:
        right = 0

    return max(left + right, longestUnivaluePath(root.left), longestUnivaluePath(root.right))

深度优先搜索

def longestUnivaluePath(root):
    max_path = 0

    def dfs(node):
        if not node:
            return 0

        left_path = dfs(node.left)
        right_path = dfs(node.right)

        if node.left and node.left.val == node.val:
            left_path += 1
        else:
            left_path = 0

        if node.right and node.right.val == node.val:
            right_path += 1
        else:
            right_path = 0

        max_path = max(max_path, left_path + right_path)

        return max(left_path, right_path)

    dfs(root)

    return max_path

复杂度分析

  • 时间复杂度:O(N),其中 N 是树中的节点数。
  • 空间复杂度:O(N),递归调用需要额外的空间来存储栈帧。

结语

算法题的魅力就在于此,它不仅能考察我们的编程能力,更能磨炼我们的思维逻辑。希望大家能多刷题,不断提升自己的技术水平。