binary-tree-maximum-path-sum(二叉树的最大路径和)

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));
    }

题目来源于牛客网leetcode

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值