题目
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
思路
先考虑一个7个节点的完全二叉树。想要遍历所有可能的路径,可以采用后序遍历的方法由上至下遍历。
因为需要找到最大路径和,在遍历一个节点时,需要找到路径和最大的分支,对应的思路为:
1.路径和应当pathVal>=0
,当路径和小于0时,就以该节点为路径的起始点。
2.如果该点的左右分支均大于0,此时应当返回左、右分支中较大的一支与该节点值的和。
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public int maxVal=Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
//后序遍历
if(root==null){return 0;}
maxPath(root);
return maxVal;
}
public int maxPath(TreeNode root){
if(root==null){return 0;}
int leftGain=Math.max(maxPath(root.left),0);//左右分支大于等于0时,对最长路径和才有贡献
int rightGain=Math.max(maxPath(root.right),0);
int tmpVal=root.val+leftGain+rightGain;
maxVal= Math.max(maxVal,tmpVal);
return root.val+Math.max(leftGain,rightGain);//选择左右分支中较大的一支返回
}
}
复杂度分析
- 时间复杂度:O(N)
- 空间复杂度:O(N)//与递归次数相关