在一棵二叉树中找到最大路径和可以通过递归实现。对于当前节点,最大路径和可能有三种情况:
- 最大路径和为当前节点的值加上左子树中的最大路径和,右子树中的最大路径和;
- 最大路径和为当前节点的值加上左子树中的最大路径和;
- 最大路径和为当前节点的值加上右子树中的最大路径和。
对于每个节点,我们需要计算这三种情况下的最大路径和,并将它们与当前最大路径和比较。
同时,我们需要返回当前节点值加上左子树和右子树中的最大路径和的和,作为向上递归时的结果。
class TreeNode {
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val) {
this.val = val;
}
}
class Solution {
private int maxPathSum = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
maxPathSumHelper(root);
return maxPathSum;
}
private int maxPathSumHelper(TreeNode node) {
if (node == null) {
return 0;
}
int leftMaxPathSum = maxPathSumHelper(node.left);
int rightMaxPathSum = maxPathSumHelper(node.right);
int maxPathSumWithNode = Math.max(node.val, Math.max(node.val + leftMaxPathSum, node.val + rightMaxPathSum));
int maxPathSumWithNodeAndChildren = Math.max(maxPathSumWithNode, node.val + leftMaxPathSum + rightMaxPathSum);
maxPathSum = Math.max(maxPathSum, maxPathSumWithNodeAndChildren);
return maxPathSumWithNode;
}
}