[LeetCode]124. 二叉树中的最大路径和
Posted coding-gaga
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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;
}
}
以上是关于[LeetCode]124. 二叉树中的最大路径和的主要内容,如果未能解决你的问题,请参考以下文章