Java - 通过二叉树的路径的最大总和

时间:2012-10-14 07:18:54

标签: java recursion binary-search-tree

我正在尝试编写一个方法来获取通过二叉树的路径的最大总和:

public class ConsTree<T> extends BinaryTree<T>
{
    BinaryTree<T> left;
    BinaryTree<T> right;
    T data;

    public int maxSum() 
    {
    }
} 

如图所示,每棵树在其左侧和右侧包含一棵树,以及一般类型的数据。关于如何开始这个我有点困惑。如果有人可以提供关于算法可能是什么样子的帮助或者让我朝着正确的方向前进,那就太棒了。感谢。

2 个答案:

答案 0 :(得分:2)

递归思考的方法是考虑案例。在我们的例子中,我们查看单个节点,并可以决定它具有哪些路径:

  1. 如果节点没有子节点,则唯一的路径是单一路径(由该节点本身组成)。
  2. 如果节点只有一个孩子,那么所有路径都会经过该孩子。
  3. 否则,该节点有两个子节点。然后,所有路径都经过两个孩子中的一个。
  4. 在案例1中,最大值必须是该节点的值。在案例2中,最大值是节点的值,加上其子节点的max-path-sum(因为该路径扩展到父节点通过唯一子节点的路径)。在案例3中,最大值是其两个子节点的最大max-path-sum(因为最佳路径必须通过两个子节点中的一个,并且父节点可以看到哪个子节点的最佳路径更好)。

    因此,代码非常简单。在这里,由于您返回int,我将假设T = int

    public int maxSum() {
        /* case 1 */
        if(left == null && right == null)
            return data;
    
        /* case 2 */
        if(right == null)
            return data + left.maxSum();
        else if(left == null)
            return data + right.maxSum();
    
        /* case 3 */
        return Math.max(data + left.maxSum(), data + right.maxSum());
    }
    

答案 1 :(得分:0)

private static int max = Integer.MIN_VALUE;

public static int maxPathSum(TreeNode root) {
    int rd = dfs(root);
    return rd > max ? rd : max;
}

// close paths:
// 1 left leaf
// 2 right leaf
// 3 left + root + right
//
// open paths:
// 4 root
// 5 left + root
// 6 right + root
private static int dfs(TreeNode root) {
    if (root.left == null && root.right == null) {
        return root.val;
    }
    if (root.left == null && root.right != null) {
        int rPathMax = dfs(root.right);
        max = rPathMax > max ? rPathMax : max;
        return Math.max(root.val, rPathMax + root.val);
    }
    if (root.right == null && root.left != null) {
        int lPathMax = dfs(root.left);
        max = lPathMax > max ? lPathMax : max;
        return Math.max(root.val, lPathMax + root.val);
    }
    int lPathMax = dfs(root.left);
    int rPathMax = dfs(root.right);
    int closePathMax = lPathMax + rPathMax + root.val;

    int innerMax = Math.max(closePathMax, Math.max(lPathMax, rPathMax));
    max = innerMax > max ? innerMax : max;
    return Math.max(root.val, Math.max(lPathMax + root.val, rPathMax + root.val));
}