1. 问题背景与核心概念
二叉树的最大路径和问题是算法领域的一个经典题目,也是各大技术面试中的高频考点。这个问题的核心在于理解"路径"在二叉树中的特殊定义——不同于常规的根到叶子的路径,这里的路径可以是任意节点到任意节点的连通路径。
我第一次遇到这个问题是在准备某大厂面试时,当时被这个看似简单实则暗藏玄机的问题难住了。经过反复琢磨和多次调试,终于搞清楚了其中的门道。下面就把我的解题思路和踩坑经验完整分享给大家。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题定义与示例分析
2.1 题目详细描述
给定一个非空二叉树,返回其最大路径和。这里的路径被定义为:树中任意节点到任意节点所经过的路径(要求路径中至少包含一个节点,且不一定经过根节点)。
示例:
输入:[-10,9,20,null,null,15,7]
输出:42
解释:最优路径是15 → 20 → 7,路径和为15+20+7=42
2.2 关键概念解析
理解这个问题的关键在于三个核心概念:
-
路径定义:不同于传统的根到叶子的路径,这里的路径可以是:
- 单个节点
- 左子树的一部分
- 右子树的一部分
- 跨越左右子树的路径(经过当前节点)
-
路径和计算:路径上所有节点值的总和
-
全局最优与局部最优:需要同时考虑以当前节点为根的子树中的最大路径和,以及当前节点对父节点路径的贡献
3. 解题思路与算法设计
3.1 递归思路分解
解决这个问题最自然的方式就是递归,因为二叉树本身就是一个递归结构。我们需要设计一个递归函数,它能够:
- 计算以当前节点为根的最大路径和
- 返回当前节点对父节点的最大贡献值
具体来说,对于每个节点,我们需要考虑四种可能的路径情况:
- 只包含当前节点本身
- 当前节点 + 左子树路径
- 当前节点 + 右子树路径
- 左子树路径 + 当前节点 + 右子树路径
3.2 算法伪代码
code复制function maxPathSum(root):
max_sum = -∞
function max_gain(node):
nonlocal max_sum
if not node:
return 0
