返回

LeetCode 124:二叉树中的最大路径和—算法之旅的开篇

前端

前言

大家好,我是[路飞],一位在技术领域耕耘多年的摸鱼老。作为一个算法爱好者,我非常荣幸能与大家分享我刷算法题过程中的心得体会。今天,我们将踏上算法之旅的第一站,共同探索 LeetCode 124:二叉树中的最大路径和。让我们一起揭开算法世界的神奇面纱!

题目概述

路径被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径中只能出现一次。

二叉树中的最大路径和是指从树中任意节点出发,沿父节点-子节点连接,达到任意节点的路径中,所有节点的值之和的最大值。

例如,对于如下的二叉树:

        1
       / \
      2   3

其最大路径和为 6,路径为 2 -> 1 -> 3。

算法解析

这个问题本质上是一个动态规划问题,我们可以利用以下两个观察来解决它:

  1. 最大路径和要么经过根节点,要么不经过根节点。
  2. 经过根节点的最大路径和等于左子树的最大路径和加上右子树的最大路径和加上根节点的值。

基于这两个观察,我们可以使用递归函数来求解最大路径和:

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

  # 求左子树和右子树的最大路径和
  left_max = max_path_sum(root.left)
  right_max = max_path_sum(root.right)

  # 计算经过根节点的最大路径和
  max_path = root.val + max(0, left_max) + max(0, right_max)

  # 更新全局最大路径和
  global max_sum
  max_sum = max(max_sum, max_path)

  # 返回以root为根节点的最大路径和
  return max(root.val, root.val + max(0, left_max), root.val + max(0, right_max))

代码示例

class TreeNode:
  def __init__(self, val=0, left=None, right=None):
    self.val = val
    self.left = left
    self.right = right

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

  # 求左子树和右子树的最大路径和
  left_max = max_path_sum(root.left)
  right_max = max_path_sum(root.right)

  # 计算经过根节点的最大路径和
  max_path = root.val + max(0, left_max) + max(0, right_max)

  # 更新全局最大路径和
  global max_sum
  max_sum = max(max_sum, max_path)

  # 返回以root为根节点的最大路径和
  return max(root.val, root.val + max(0, left_max), root.val + max(0, right_max))

if __name__ == "__main__":
  # 构造二叉树
  root = TreeNode(1)
  root.left = TreeNode(2)
  root.right = TreeNode(3)

  # 求解最大路径和
  max_sum = float('-inf')
  max_path_sum(root)

  print("最大路径和为:", max_sum)

结语

通过 LeetCode 124:二叉树中的最大路径和,我们窥见了算法世界的神奇魅力。它不仅锻炼了我们的逻辑思维能力,也培养了我们解决问题时庖丁解牛的魄力。我相信,只要坚持不懈地学习和探索,算法世界的大门将会为你敞开,为你带来无限的乐趣和挑战。

我是[路飞],让我们携手共进,在算法的海洋中扬帆远航!