LeetCode 124 二叉树中的最大路径和解题详解
在二叉树相关题目练习中,路径类问题因其定义灵活、遍历方向不确定等特点,往往成为解题难点。本文将针对经典难题——LeetCode 124. 二叉树中的最大路径和,从题目解读、解题思路、代码实现到常见误区,逐步拆解核心逻辑,帮助读者厘清解题思路,规避常见错误。
一、题目解读:读懂'路径'的关键定义
明确题目中'路径'的核心定义是解题的前提,多数解题错误源于对路径规则的误解,具体规则如下:
- 路径为节点序列,相邻节点之间必须存在边连接,不可跳跃节点;
- 同一节点在单条路径中至多出现一次,避免形成循环路径;
- 路径至少包含一个节点,极端情况下,当二叉树仅含一个节点时,该节点即为路径本身;
- 路径不一定经过根节点,子树中的路径和可能大于经过根节点的路径和,这是解题的关键要点。
题目要求:给定二叉树的根节点 root,返回所有可能路径中节点值总和的最大值(路径和定义为路径中所有节点值的累加和)。
通过示例进一步理解题意
示例 1: 二叉树为 [1,2,3](根节点为 1,左子节点为 2,右子节点为 3)
路径 (2,1,3) 和为 6,为该树最大路径和。 该二叉树的所有可能路径及对应路径和如下:[2](和为 2)、[3](和为 3)、[1](和为 1)、[2,1,3](和为 6)、[1,2](和为 3)、[1,3](和为 4),其中最大路径和为 6。
示例 2: 二叉树为 [-10,9,20,null,null,15,7](根节点为 -10,左子节点为 9,右子节点为 20;20 的左子节点为 15,右子节点为 7)
路径 [15,20,7] 和为 42,为该树最大路径和。 该二叉树中,路径 [15,20,7] 的路径和为 42,是所有可能路径中的最大值,其路径和大于经过根节点的路径和。
二、解题思路:DFS 的适用性分析
二叉树路径类问题通常可采用深度优先搜索(DFS)求解,其核心原因在于 DFS 能够天然遍历每个节点的左右子树,便于计算以当前节点为核心的路径和,适配路径'向下延伸'或'跨节点延伸'的特点。
本题的核心难点在于:路径可呈现'分叉'形态(如示例 1 中的路径 2→1→3,以节点 1 为中心,分别向左右子树延伸),但递归向上层节点回溯时,路径不可分叉——上层节点的路径仅能从左、右子树中选择一条继续延伸。
核心思路拆解(核心要点)
解题的关键在于区分两个核心概念,二者极易混淆,需重点厘清:
- 顶点路径和:以当前节点为中心,可同时向左右两个子树延伸,属于完整路径,核心作用是更新全局最大路径和。
- 贡献路径和:仅能向左右子树中的一条延伸(不可跨层分叉),核心作用是向父节点传递有效路径和,供父节点计算自身路径和使用。
基于上述两类路径和,DFS 递归遍历的流程固定为 3 步:
- 步骤 1:计算子树贡献值——递归遍历当前节点的左、右子树,分别获取其向当前节点的贡献值;若贡献值为负数,取 0 舍弃(避免降低整体路径和);
- 步骤 2:更新全局最大路径和——计算当前节点的顶点路径和(左贡献值 + 右贡献值 + 当前节点值),与全局 maxSum 对比,取较大值更新;
- 步骤 3:返回父节点贡献值——向父节点返回当前节点的贡献路径和(左、右子树贡献值的最大值 + 当前节点值),确保父节点仅能选择单一路径延伸。
补充注意点:全局最大路径和(maxSum)需初始化为负无穷(-Infinity),而非 0。原因是二叉树可能存在所有节点值均为负数的极端场景,此时最大路径和应为单个节点的最大值,若初始化为 0 会导致结果错误。
三、代码详解:逐行拆解与逻辑分析
题目已给出 TreeNode 的定义及函数框架,以下先给出完整可运行的 TypeScript 代码,再逐行解析核心逻辑(JavaScript 版本可删除类型注解直接使用)。
完整可运行代码
// 二叉树节点定义(题目已给出,无需修改)
class TreeNode {
val: number;
: | ;
: | ;
() {
. = (val === ? : val);
. = (left === ? : left);
. = (right === ? : right);
}
}
(): {
(!root) ;
maxSum = -;
dfs = (: | ): {
(!node) ;
left = .(, (node.));
right = .(, (node.));
maxSum = .(maxSum, left + right + node.);
.(left, right) + node.;
};
(root);
maxSum;
}


