124.二叉树中的最大路径和
class Solution {
/**
*思想,自底向上,原地修改每个节点,修改为经过节点的最大路径和
*前提:每个节点(除了始末节点)都有两个分支,与其根相连、与其左子树相连、与其右子树相连(三选二)
*所以,选择策略就是就可以分为两个,(1)选择左右子树中最大的那条路径,然后与其根相连;(2)同时选择其左右子树路径形成最长路径
*全局变量MAX就来记录最长路径
*/
int MAX = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root){
if (root == null) return 0;
postOrder(root);
return MAX;
}
public int postOrder(TreeNode node){
if (node == null) return 0;
int l = 0,r = 0;
l = postOrder(node.left);
r = postOrder(node.right);
if (l+r+node.val > MAX) MAX = l+r+node.val;//策略1:路径终止,作为中间节点,同时选择左右路径,此时该节点就不能在分叉出去了
int max = Math.max(l,r);
node.val = Math.max(0,max)+node.val;
if (node.val > MAX) MAX = node.val;//策略2:选择左右路径中最长的路径
return node.val;
}
}