题目来源:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/
大致题意:
给一个二叉树,若以父子关系为路径,在所有节点只能经过一次的情况下,所能经过的最大路径和
思路
对于叶节点来说,其最大路径和为其本身
对叶节点的父节点的子树来说,其最大路径为 max( max(左节点, 右节点, 0) + 节点值, 左节点 + 右节点 + 节点值)。并且若路径为后者 左节点 + 右节点 + 节点值
,那么就不会再有该子树之外的节点可以添加进来,也就是只能在本子树中获得的最大路径和
于是,可以递归获取二叉数的最大路径和,当前子树对父节点的最大路径和贡献值即为
- max(左子树的最大路径和, 右节点的最大路径和, 0) + 当前子树根节点值
同时,在遍历到每个子树时,维护一个最大值变量(即答案),其存当前左子树的最大路径和 + 右节点的最大路径和 + 当前子树根节点值
中的最大值,即不能添加其它子树节点的路径,只能在本子树中获得的最大路径和
那么,最终的答案即为遍历中可以获得的最大值
class Solution {
int ans;
public int maxPathSum(TreeNode root) {
// 最大路径和
ans = Integer.MIN_VALUE;
return Math.max(dfs(root), ans);
}
public int dfs(TreeNode node) {
if (node == null) {
return 0;
}
// 左子树的最大路径和
int leftSum = dfs(node.left);
// 右子树的最大路径和
int rightSum = dfs(node.right);
// 更新答案,leftSum + rightSum + node.val 为只能在本子树中获得的最大路径和
ans = Math.max(leftSum + rightSum + node.val, ans);
// 本子树对父节点的最大路径和贡献
int curSum = Math.max(Math.max(leftSum, rightSum), 0) + node.val;
// 更新答案
ans = Math.max(curSum, ans);
return curSum;
}
}