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;
}
}
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;
}
}
相关文章推荐
- [LeetCode] Binary Tree Maximum Path Sum
- [leetcode] Binary Tree Maximum Path Sum
- leetcode Binary Tree Maximum Path Sum
- Leetcode::Binary Tree Maximum Path Sum
- Leetcode Maximum SubArray & Binary Tree Maximum Path Sum
- Leetcode -- Binary Tree Maximum Path Sum
- Leetcode: Binary Tree Maximum Path Sum
- leetcode: Binary Tree Maximum Path Sum
- LeetCode--binary-tree-maximum-path-sum
- leetcode--Binary Tree Maximum Path Sum
- [leetcode刷题系列]Binary Tree Maximum Path Sum
- LeetCode之Binary Tree Maximum Path Sum
- LeetCode Week5:Recover Binary Search Tree、Binary Tree Maximum Path Sum
- LeetCode-Binary Tree Maximum Path Sum
- 【Leetcode】Binary Tree Maximum Path (Sum)
- LeetCode Binary Tree Maximum Path Sum
- LeetCode--Binary Tree Maximum Path Sum
- [LeetCode]题解(python):124-Binary Tree Maximum Path Sum
- 【leetcode】binary-tree-maximum-path-sum
- LeetCode_124 Binary Tree Maximum Path Sum