不了解二叉树最大路径总和问题的解决方案
网站GeeksforGeeks为二叉树的最大路径总和问题提出了一个解决方案。问题如下:
给定一个二叉树,找到最大路径总和。路径可以在树中的任何节点开始和结束。
该解决方案的核心如下:
int findMaxUtil(Node node, Res res)
{
if (node == null)
return 0;
// l and r store maximum path sum going through left and
// right child of root respectively
int l = findMaxUtil(node.left, res);
int r = findMaxUtil(node.right, res);
// Max path for parent call of root. This path must
// include at-most one child of root
int max_single = Math.max(Math.max(l, r) + node.data,
node.data);
// Max Top represents the sum when the Node under
// consideration is the root of the maxsum path and no
// ancestors of root are there in max sum path
int max_top = Math.max(max_single, l + r + node.data);
// Store the Maximum Result.
res.val = Math.max(res.val, max_top);
return max_single;
}
int findMaxSum() {
return findMaxSum(root);
}
// Returns maximum path sum in tree with given root
int findMaxSum(Node node) {
// Initialize result
// int res2 = Integer.MIN_VALUE;
Res res = new Res();
res.val = Integer.MIN_VALUE;
// Compute and return result
findMaxUtil(node, res);
return res.val;
}
Res
具有以下定义:
class Res {
public int val;
}
我对这些代码行背后的推理感到困惑:
int max_single = Math.max(Math.max(l, r) + node.data, node.data);
int max_top = Math.max(max_single, l + r + node.data);
res.val = Math.max(res.val, max_top);
return max_single;
我相信上面的代码遵循这个逻辑,但我不明白为什么这个逻辑是正确的或有效的:
对于每个节点,最大路径可以通过四种方式通过节点:
- 仅节点
- 通过左子节点 + 节点的最大路径
- 通过右子节点 + 节点的最大路径
- 通过左子节点 + 节点的最大路径 + 通过右子节点的最大路径
特别是,我不明白为什么当我们变量包含我们感兴趣的答案时,函数中会返回。网站上给出了以下原因,但我不明白:max_single
findMaxUtil
res.val
需要注意的重要一点是,每个子树的根都需要返回最大路径和,以便最多涉及根的一个子级。
有人可以为解决方案的这一步提供解释吗?