1.题目
给定一个二叉树,找到最大路径和。 路径可以在树中的任何节点开始和结束。 例如: 鉴于下面的二叉树, 1 / \ 2 3 返回6
2.分析过程
首先我们分析一下对于指定某个节点为根时,最大的路径和有可能是哪些情况: (1)最大路径包含该根节点 最大路径之和=根节点的值+深度遍历其左子树的路径和的最大值 +深度遍历其右子树的路径和的最大值 (2)最大路径不包含该根节点 ①该根节点的左孩子作为新的根节点的最大路径和 ②该根节点的右孩子作为新的根节点的最大路径和 最大路径和为三者中的最大值。
3.代码实现
/**
* 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) {
if(root==null) return 0;
if(root.left==null && root.right==null) return root.val;
int max1=root.val+(dfs(root.left)>0?dfs(root.left):0)+(dfs(root.right)>0?dfs(root.right):0);//最大路径包含根节点
int max2=Integer.MIN_VALUE,max3=Integer.MIN_VALUE;
if(root.left!=null){
max2=maxPathSum(root.left);//根节点的左孩子作为新的根节点时的最大路径和
}
if(root.right!=null){
max3=maxPathSum(root.right);//根节点的右孩子作为新的根节点时的最大路径和
}
int max=Math.max(max1,max2);
max=Math.max(max,max3);
return max;
}
public int dfs(TreeNode node){//深度遍历,获取每个根节点对应的最大路径和
if(node==null) return 0;
if(node.left==null && node.right==null) {
if(node.val>0)
return node.val;
else
return 0;
}
int left=dfs(node.left);
int right=dfs(node.right);
if(node.val>=0){
if(left<=0 && right<=0){
return node.val;
}else{
if(left>right){
return node.val+left;
}else{
return node.val+right;
}
}
}else{
if(node.val+left<=0 && node.val+right<=0){
return 0;
}else{
if(left>right){
return node.val+left;
}else{
return node.val+right;
}
}
}
}
}
题目的变型:如果规定二叉树中的节点的值都为正整数,则可用普通的深度遍历解决。
代码如下:
public int maxPathSum(TreeNode root) {
if(root==null) return 0;
if(root.left==null && root.right==null) return root.val;
int max1=root.val+dfs(root.left)+dfs(root.right);
int max2=0,max3=0;
if(root.left!=null){
max2=root.left.val+dfs(root.left.left)+dfs(root.left.right);
}
if(root.right!=null){
max2=root.right.val+dfs(root.right.left)+dfs(root.right.right);
}
int max=Math.max(max1,max2);
max=Math.max(max,max3);
return max;
}
public int dfs(TreeNode node){
if(node==null) return 0;
if(node.left==null && node.right==null) return node.val;
return Math.max(node.val+dfs(node.left),node.val+dfs(node.right));
}