【leetcode-树】二叉树中的最大路径和
题目:
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例 1:
输入: [1,2,3]
1
/ \
2 3
输出: 6
示例 2:
输入: [-10,9,20,null,null,15,7]
-10
/ \
9 20
/ \
15 7
输出: 42
思路:
最大和的路径基本只有以下几种情况:
某个节点自身
形如 d-b-e 这种 以某节点 b 为根节点的”完全子树“(选择的节点要么左右孩子也都加入,要么都不加入)
形如 d-b-a-c-f 这种含有”不完全子树“(如没有加入b的右孩子e,c的右孩子g)
因此,采取递归的思想,先遍历到叶子节点,逐层返回当前分支最大路径和。
如果最大路径是1或者2情况的话,那么是不需要回溯的,也就是说,对于1和2只需要判断root+left+right这一路径和是否为最大路径即可,不必向上层返回值;而3则需要继续判断当前 root+left或者root+right是否为最终路径的左或右分支(如d-b是d-b-a-c-f的左分支),因此需要回溯时需要返回root+left和root+right其中的最大值,如果root的左右孩子都是负数,那么当前子路径就是root节点本身,即返回root即可。
java代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
private int res = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
compute(root);
return res;
}
private int compute(TreeNode root){
if(root == null){
return 0;
}
//经过左节点的路径的最大和
int lMax = compute(root.left);
//经过右节点的路径的最大和
int rMax = compute(root.right);
//以当前节点为根节点的路径最大和
res = Math.max(res,Math.max(0,lMax)+Math.max(0,rMax)+root.val);
//返回 经过当前节点的路径最大和
return Math.max(0,Math.max(lMax,rMax)+root.val);
}
}
由于水平有限,文章中难免会有一些错误,有纰漏之处恳请各位大佬不吝赐教!