题目
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-maximum-path-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解答
递归解法最简单,其实这道题本质上是一道类似 后序遍历 的题目。
注意路径的特点:同一条路径上的结点不能被遍历两次。
这就意味着:
- 如果当前结点是路径中的根节点,那么将左右两边路径和大于 0 的路径全部留下。
- 如果当前结点不是路径中的根节点,那就只能在左右两边路径和大于 0 的路径中选择一条或一个也不选 (两边都小于0)
非递归解法跟二叉树的后序遍历的递归写法相似,这里不再赘述。
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int res = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
helper(root);
return res;
}
private int helper(TreeNode node) {
if(node == null) return 0;
int left = Math.max(helper(node.left), 0);
int right = Math.max(helper(node.right), 0);
res = Math.max(res, left + right + node.val);
return Math.max(left, right) + node.val;
}
}