Java 如何解决;二叉树最大路径积;?
这个问题看起来很像,除了节点值可以是正的、负的或零,并且结果应该是最大路径积,而不是最大路径和。 有人能帮忙吗 更新-1: 以下是“二叉树最大路径和”的经典解决方案: 更新-2: 下面是一个针对最大路径产品的简单解决方案。您可以使用“定制测试用例”对其进行测试Java 如何解决;二叉树最大路径积;?,java,algorithm,binary-tree,Java,Algorithm,Binary Tree,这个问题看起来很像,除了节点值可以是正的、负的或零,并且结果应该是最大路径积,而不是最大路径和。 有人能帮忙吗 更新-1: 以下是“二叉树最大路径和”的经典解决方案: 更新-2: 下面是一个针对最大路径产品的简单解决方案。您可以使用“定制测试用例”对其进行测试 是否有指向“最大路径和”摘要解决方案的链接?我猜乘积的解决方案非常相似,除了您保留的摘要信息(而不是最大和)是最大乘积和最小乘积。@RobNeuhaus,我已经在文章中添加了最大路径和的解决方案。正如你所说,我想保持一对来跟踪每个子树的
是否有指向“最大路径和”摘要解决方案的链接?我猜乘积的解决方案非常相似,除了您保留的摘要信息(而不是最大和)是最大乘积和最小乘积。@RobNeuhaus,我已经在文章中添加了最大路径和的解决方案。正如你所说,我想保持一对来跟踪每个子树的最小值和最大值,但我认为计算当前的最小值和最大值是很困难的,有什么优雅的方法吗?当你达到0时,没有必要继续沿着这条路径。那是一个optimization@cricket_007是的,你说得对。但是它对算法没有影响。我认为你需要更新你的问题多一点。现在你说你想要MPP,但你没有得到。然后你给出了一个假设的代码,它完全不起任何作用,然后我们可以根据你告诉我们的,假设它不起作用。详述你想要什么和不理解什么。由此看来,这可能是一个不错的代码审查问题。希望有帮助:)
public class Solution {
int maxValue;
public int maxPathSum(TreeNode root) {
maxValue = Integer.MIN_VALUE;
maxPathDown(root);
return maxValue;
}
private int maxPathDown(TreeNode node) {
if (node == null) return 0;
int left = Math.max(0, maxPathDown(node.left));
int right = Math.max(0, maxPathDown(node.right));
maxValue = Math.max(maxValue, left + right + node.val);
return Math.max(left, right) + node.val;
}
}
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
int maxProduct = Integer.MIN_VALUE;
class Pair{
int min;
int max;
public Pair(int min, int max){
this.min = min;
this.max = max;
}
}
public int maxPathSum(TreeNode root) {
helper(root);
return maxProduct;
}
public Pair helper(TreeNode root){
if(root == null) return new Pair(0, 0);
Pair left = helper(root.left);
Pair right = helper(root.right);
//update global max product
if(root.val == 0){
maxProduct = Math.max(maxProduct, 0);
}else{
maxProduct = Math.max(maxProduct, root.val);
maxProduct = Math.max(maxProduct, root.val * left.min);
maxProduct = Math.max(maxProduct, root.val * left.max);
maxProduct = Math.max(maxProduct, root.val * right.min);
maxProduct = Math.max(maxProduct, root.val * right.max);
maxProduct = Math.max(maxProduct, root.val * left.min * right.min);
maxProduct = Math.max(maxProduct, root.val * left.min * right.max);
maxProduct = Math.max(maxProduct, root.val * left.max * right.min);
maxProduct = Math.max(maxProduct, root.val * left.max * right.max);
}
int min = 0, max = 0; // if root.val == 0 then , min and max should be 0 both
//calculate min and max path product including root
min = Math.min(min, root.val);
min = Math.min(min, root.val * left.min);
min = Math.min(min, root.val * left.max);
min = Math.min(min, root.val * right.min);
min = Math.min(min, root.val * right.max);
max = Math.max(max, root.val);
max = Math.max(max, root.val * left.min);
max = Math.max(max, root.val * left.max);
max = Math.max(max, root.val * right.min);
max = Math.max(max, root.val * right.max);
return new Pair(min, max);
}
}