/**
* @param {TreeNode} root
* @return {number}
*/
// 子树的最大路径和 = 左子树提供的最大路径和 +根节点值 + 右子树的的最大路径和,
// 分别递归遍历左子树和右子树的最大路径和,两者之前取一个最大值;返回;
// 最后里面,要注意最后得出的是一个负数,直接返回0;否则正常的数据就直接返回;
var maxPathSum = function(root) {
let maxSum = -Infinity;//最大路径和
function dfs(root){
if(!root) return 0;
let left=dfs(root.left)
let right=dfs(root.right)
// 当前子树内部最大路径和
let currentMaxSum=root.val+left+right
maxSum=Math.max(maxSum,currentMaxSum)//挑战最大紀录
//当前子树外部的最大路径和:小于0的情况
let currentPathMaxSum=root.val+Math.max(left,right)//当前子树对外提供的路径和
//如果对外提供的路径和小于0,直接返回6:否则正常返回
return currentPathMaxSum<0?0:currentPathMaxSum
}
dfs(root)
return maxSum
};
var maxPathSum = function(root) {
let maxSum = -Infinity;
function dfs(node) {
if (!node) return 0;
// 递归计算左右子树的最大贡献值,忽略负数贡献
let leftGain = Math.max(0, dfs(node.left));
let rightGain = Math.max(0, dfs(node.right));
// 更新最大路径和,考虑当前节点作为路径的一部分
maxSum = Math.max(maxSum, node.val + leftGain + rightGain);
// 返回当前节点对外提供的最大路径和
return node.val + Math.max(leftGain, rightGain);
}
dfs(root);
return maxSum;
};
class TreeNode {
constructor(val, left = null, right = null) {
this.val = val;
this.left = left;
this.right = right;
}
}
// 构建测试用例
// let arrRoot = [-10,9,20,null,null,15,7];
// let arrRoot = [1,2,3];
let arrRoot = [-3];
let root = buildTree(arrRoot);
function buildTree(arr) {
if (arr.length === 0) return null;
let root = new TreeNode(arr[0]);
let queue = [root];
for (let i = 1; i < arr.length; i++) {
let node = queue.shift();
if (i * 2 - 1 < arr.length) {
node.left = new TreeNode(arr[i * 2 - 1]);
queue.push(node.left);
}
if (i * 2 < arr.length) {
node.right = new TreeNode(arr[i * 2]);
queue.push(node.right);
}
}
return root;
}
console.log(maxPathSum(root));
标签:right,路径,子树,let,二叉树,124,root,left
From: https://www.cnblogs.com/KooTeam/p/18652039