最大路径和为经过某节点的跨子树路径和的最大值;需DFS中分别计算单向贡献(返回max(0,子树和)+当前值)与跨根路径(当前值+max(0,左)+max(0,右)),并用全局变量实时更新答案。

要计算二叉树中任意节点出发、经过若干节点、最终到达另一节点的路径上节点值之和的最大值,必须同时处理单侧贡献与跨根路径两种情形,不能只做简单DFS求和。
定义递归状态与返回值语义
编写递归函数 int dfs(TreeNode* node),该函数返回「以当前节点为起点向下延伸所能提供的最大单向路径和」,即只能走左子树或右子树之一,且必须包含当前节点本身。
这个返回值不等于全局答案,它只服务于父节点计算跨子树路径;全局最大值需在每次递归中用额外变量实时更新。
若节点为空,返回0——空节点不贡献任何收益,但也不应拉低父节点路径和。
立即学习“C++免费学习笔记(深入)”;
递归体内的路径拆解与组合
对当前节点node,先递归获取左右子树各自能向上提供的最大单向路径和:left = dfs(node->left),right = dfs(node->right)。
注意:left和right可能为负数,此时选择不走该子树更优,因此参与路径计算前需与0取max:left = max(left, 0),right = max(right, 0)。
当前节点作为路径最高点时,可形成的跨子树路径和为 node->val + left + right,用此值更新全局最大路径和ans。
当前节点能向上贡献的最大单向路径和是 node->val + max(left, right),这是dfs函数必须返回的值。
初始化与主调用逻辑
声明全局变量int ans = INT_MIN,在进入dfs前完成初始化。
调用dfs(root),若root为空则直接返回0,否则递归展开。
【root为空时dfs返回0,但ans仍为INT_MIN,必须在dfs内部至少一次更新ans,否则返回错误结果】
最终返回ans作为答案。


















