您的位置:首页 > 其它

LeetCode 28 Binary Tree Maximum Path Sum

2014-08-28 10:36 447 查看
Given a binary tree, find the maximum path sum.

The path may start and end at any node in the tree.

For example:

Given the below binary tree,

1
/ \
2 3

Return 6.
分析:

刚看到题,以为是图算法,找最大路径和。但考虑到树是有向图,没有办法直接从子节点遍历到父节点。

但对于任意一个节点,都可以计算以此节点开始(即此节点是路径的一端)往下遍历的最大路径和。

有了上面的认识,

对于某一个节点,我们就可以用 左孩子的路径,右孩子的路径 以及当前节点组合成任意两点间的路径(此路径经过当前节点)。

既然,任意两点的路径可以如此构造,那么任意两点间路径和也可以求出。

思路清晰了之后,

我么对树进行遍历,并求出经过每个节点的最大路径和,进行比较即可。

几个注意点

1,递归访问时,函数返回的应该是以当前节点开始往下的最大路径和;

2,Java中参数是值传递,所以max要是一个引用变量,最简单的就是数组咯,声明为只有一个元素的数组即可。

/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public int maxPathSum(TreeNode root) {
//max用来记录最大路径和
int[] max = new int[1];
max[0] = Integer.MIN_VALUE;
calSum(root, max);
return max[0];
}
//此函数返回node开始往下的最大路径和
public int calSum(TreeNode node, int[] max){
if(node == null)
return 0;

int left = calSum(node.left, max);
int right = calSum(node.right, max);
//根据左右孩子的情况计算当前节点开始往下的最大路径和
int current = Math.max(node.val, Math.max(node.val+left, node.val+right));
//更新max
max[0] = Math.max(max[0], Math.max(current, left+node.val+right));

return current;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  树遍历 递归