返回

价值相同的最长路径

后端

前言

LeetCode 687 题要求求二叉树中所有根到叶路径中,值相同的最长路径。给定一个二叉树,求其所有根到叶路径中,值相同的最长路径。若不存在这样的路径,则返回 0。

使用 DFS 递归法解决 LeetCode 687 题

为了解决这个问题,我们可以使用 DFS(深度优先搜索)递归算法。具体步骤如下:

  1. 从根节点开始,使用 DFS 递归算法遍历整棵二叉树。
  2. 在每个节点处,计算以该节点为起点的最长相同值路径长度。
  3. 将该长度与当前最长相同值路径长度比较,并更新当前最长相同值路径长度。
  4. 继续 DFS 遍历,直到所有节点都被遍历完成。

算法步骤

  1. 定义函数 longestUnivaluePath,该函数接收一个二叉树的根节点作为参数,并返回以该节点为起点的最长相同值路径长度。
  2. 在函数 longestUnivaluePath 中,首先检查该节点是否为空。如果是空,则返回 0。
  3. 如果该节点不为空,则计算以该节点为起点的最长相同值路径长度。首先,检查该节点的值是否与左子节点的值相同。如果是,则计算以该节点和左子节点为起点的最长相同值路径长度。然后,检查该节点的值是否与右子节点的值相同。如果是,则计算以该节点和右子节点为起点的最长相同值路径长度。将这两个长度与当前最长相同值路径长度比较,并更新当前最长相同值路径长度。
  4. 最后,将当前最长相同值路径长度返回。

代码实现

def longestUnivaluePath(root):
  """
  计算二叉树中所有根到叶路径中,值相同的最长路径。

  Args:
    root: 二叉树的根节点。

  Returns:
    最长相同值路径长度。
  """

  # 检查该节点是否为空。
  if root is None:
    return 0

  # 计算以该节点为起点的最长相同值路径长度。
  left_path = longestUnivaluePath(root.left)
  right_path = longestUnivaluePath(root.right)
  same_path = 1
  if root.left and root.left.val == root.val:
    same_path += left_path
  if root.right and root.right.val == root.val:
    same_path += right_path

  # 将这两个长度与当前最长相同值路径长度比较,并更新当前最长相同值路径长度。
  max_path = max(left_path, right_path, same_path)

  # 将当前最长相同值路径长度返回。
  return max_path

复杂度分析

算法的时间复杂度为 O(n),其中 n 为二叉树的节点数。算法的空间复杂度为 O(h),其中 h 为二叉树的高度。

结语

使用 DFS 递归法可以有效地求解 LeetCode 687 题。该算法的时间复杂度为 O(n),空间复杂度为 O(h)。