Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何解决;二叉树最大路径积;?_Java_Algorithm_Binary Tree - Fatal编程技术网

Java 如何解决;二叉树最大路径积;?

Java 如何解决;二叉树最大路径积;?,java,algorithm,binary-tree,Java,Algorithm,Binary Tree,这个问题看起来很像,除了节点值可以是正的、负的或零,并且结果应该是最大路径积,而不是最大路径和。 有人能帮忙吗 更新-1: 以下是“二叉树最大路径和”的经典解决方案: 更新-2: 下面是一个针对最大路径产品的简单解决方案。您可以使用“定制测试用例”对其进行测试 是否有指向“最大路径和”摘要解决方案的链接?我猜乘积的解决方案非常相似,除了您保留的摘要信息(而不是最大和)是最大乘积和最小乘积。@RobNeuhaus,我已经在文章中添加了最大路径和的解决方案。正如你所说,我想保持一对来跟踪每个子树的

这个问题看起来很像,除了节点值可以是正的、负的或零,并且结果应该是最大路径积,而不是最大路径和。 有人能帮忙吗

更新-1: 以下是“二叉树最大路径和”的经典解决方案:

更新-2: 下面是一个针对最大路径产品的简单解决方案。您可以使用“定制测试用例”对其进行测试


是否有指向“最大路径和”摘要解决方案的链接?我猜乘积的解决方案非常相似,除了您保留的摘要信息(而不是最大和)是最大乘积和最小乘积。@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);
    }
}