[LeetCode]124. 二叉树中的最大路径和

题目

给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。

题解

  • 题意理解:注意该路径至少包含一个节点,所以若节点都是负值,则最大值也是负值而不是取0;
  • 首先考虑是是不是树形DP?或许算是,但要特别注意下面这一点;
  • 如下图,当前子树最大路径和=max(左子树max,右子树max,f(左子树中路径一端为"L节点"max,右子树中路径一端为"R节点"max)),上式中“左/右子树max”蓝绿路径情形均可,而“左/右子树中路径一端为"L节点"max”只应为蓝色路径情形

    故,
    1 用全局变量max维护当前最大路径和(即蓝绿均可);
    2 将当前子树包含根结点的最大路径和返回给父节点 (即蓝色) ;

代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public int max = Integer.MIN_VALUE;// 维护当前最大路径和

    public void main(String args[]) {

    }

    public int maxPathSum(TreeNode root) {
        maxRootPathSum(root);
        return max;
    }

    private int maxRootPathSum(TreeNode root) {// 作用1:返回路径一端为当前根节点的最大路径和(即最多只能包含一边子树的路径);//
                                                        // 作用2:更新当前最大路径和max
        if (root == null) {
            // 此时只返回值,不更新最大值,保证当树只有负数值节点时,最大值不会是0;
            return 0;
        }
        int lMaxSum = maxRootPathSum(root.left);
        int rMaxSum = maxRootPathSum(root.right);
        int maxTmp = root.val + Math.max(lMaxSum, 0) + Math.max(rMaxSum, 0);
        max = Math.max(maxTmp, max);// maxTmp为必须包含根结点的当前树的最大路径,与max比较,更新当前最大路径和max

        int maxRootPathSum = Math.max(root.val + Math.max(lMaxSum, 0), // 计算路径一端为当前根节点的最大路径和,并作为返回值传递给父节点
                root.val + Math.max(rMaxSum, 0));
        return maxRootPathSum;
    }
}

猜你喜欢

转载自www.cnblogs.com/coding-gaga/p/12181407.html