124.二叉树中的最大路径和
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
后序遍历思想
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
/*
对于任意一个节点, 如果最大和路径包含该节点, 那么只可能是两种情况:
1. 其左或右子树中所构成的和路径值较大的那边+该节点的值后,向父节点回溯构成最大路径
2. 左右子树都在最大路径中, 加上该节点的值构成了最终的最大路径
*/
private int ans = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
if(root == null) {
return 0;
}
help(root);
return ans;
}
public int help(TreeNode root) {
if(root == null) {
return 0;
}
// 如果子树路径和为负,则应当置0,表示最大路径不包含子树
int left = Math.max(0, help(root.left));
int right = Math.max(0, help(root.right));
// 判断在该节点包含左右子树的路径和,是否大于当前最大路径和
int sum = root.val + left + right;
ans = Math.max(ans, sum);
// 只能返回单边路径和最大的结果,用于递归回溯
return Math.max(left, right) + root.val;
}
}