1. 二叉树最大路径和问题解析
今天我们来深入探讨LeetCode第124题"二叉树中的最大路径和"。这道题在各大科技公司的面试中出现频率极高,也是二叉树类问题中的经典难题。我第一次做这道题时花了整整两个小时才理清思路,后来在多次面试中又遇到它的各种变种,逐渐总结出了一套系统性的解法。
最大路径和问题的核心在于:在二叉树中寻找一条节点序列,使得序列中节点值的和达到最大。这里的路径定义比较特殊,需要特别注意三点:
- 路径是节点序列,相邻节点必须有边连接
- 同一个节点在路径中最多出现一次
- 路径至少包含一个节点,且不一定经过根节点
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题分析与解题思路
2.1 理解路径的几种可能情况
要解决这个问题,首先需要明确在二叉树中路径可能存在的几种形式:
- 单节点路径:只包含一个节点
- 直线路径:从左子节点经过父节点到右子节点(不能折返)
- 分支路径:从子节点到父节点再到另一个子节点
关键在于认识到最大路径和可能出现在:
- 当前节点本身
- 当前节点+左子树路径
- 当前节点+右子树路径
- 左子树路径+当前节点+右子树路径
2.2 递归思路的设计
这道题最适合采用后序遍历的递归解法,因为我们需要先处理子节点再处理父节点。递归函数需要完成两个任务:
- 计算以当前节点为根的最大单边路径和(供父节点使用)
- 在递归过程中更新全局最大路径和
递归函数的定义可以这样设计:
python复制def maxPathSum(root):
max_sum = float('-inf') # 初始化全局最大值
def helper(node):
nonlocal max_sum
if not node:
return 0
# 递归计算左右子树的最大贡献值
left_gain = max(helper(node.left), 0)
right_gain = max(helper(node.right), 0)
# 当前节点作为根节点的最大路径和
price_newpath = node.val + left_g
