传送门
https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/solution/
题目描述
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
题目分析
路径定义与平时用的有区别。本题中:树任意两点间的距离
节点值可能为负,若为负,不计入路径长度中
递归法
通过子节点的值逐渐累加,得到路径值,所以用树的后序遍历。
void travel(p){
if(p!=null){
travel(p->left);
travel(p->right);
visit(p)
}
}
本题中,递归函数——每个节点在路径中的值
- 空节点,值为0
- 非空节点,值为节点本身+ max(left,right)
同时,设置一个全局变量,表示当前树中最大路径长度Length
Length
为每次递归时,Length
为max
(Length
, p->val+left+right
)
例如
叶子节点:9,15,7
20节点,贡献值为20+15=35,此时路径长度为15+7+20=42,节点15到节点7
-10节点,贡献值为负,放弃该点
因此,这棵树中的最大路径和为42
import java.util.*;
class Solution {
/* 节点值可能为负,不计算负节点的值
本题路径:二叉树任意两个节点之间的路径
仿照二叉树后序遍历过程
递归/非递归
*/
//递归
int Length = Integer.MIN_VALUE; //全局变量,存储路径长度最大值
public int maxPathSum(TreeNode root) {
result(root);
return Length;
}
public int result(TreeNode p){
if(p==null){
return 0;
}
//当前节点左/右孩子路径和,若为负,则弃
int left = Math.max(result(p.left),0);
int right = Math.max(result(p.right),0);
//比较加入当前节点后的路径和,与此时路径长度最大值
int res = left + right + p.val;
Length = Math.max(Length,res);
return p.val+Math.max(left,right);
}
}
复杂度分析
时间复杂度:O(N),其中 N是二叉树中的节点个数。对每个节点访问不超过 2 次。
空间复杂度:O(N),其中 N是二叉树中的节点个数。空间复杂度主要取决于递归调用层数,最大层数等于二叉树的高度,最坏情况下,二叉树的高度等于二叉树中的节点个数。
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/solution/er-cha-shu-zhong-de-zui-da-lu-jing-he-by-leetcode-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。