LeetCode0124-二叉树中的最大路径和

这篇博客探讨了LeetCode第0124题,目标是找到非空二叉树中的最大路径和。文章通过示例解释了问题,并提供了相关代码及运行结果。
摘要由CSDN通过智能技术生成

LeetCode0124-二叉树中的最大路径和

题目

给定一个非空二叉树,返回其最大路径和。

本题中,路径被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点

示例 1:
输入:[1,2,3]

	   1
 	  / \
 	 2   3

输出:6
示例 2:
输入:[-10,9,20,null,null,15,7]

-10
 / \
9  20
/  \
15   7

输出:42

代码:

/**
 * 0124-二叉树中的最大路径和
 * 给定一个非空二叉树,返回其最大路径和。
 * <p>
 * 本题中,路径被定义为一条从树中任意节点出发,沿父节点-子节点连接,
 * 达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
 * <p>
 * <p>
 * 示例 1:
 * <p>
 * 输入:[1,2,3]
 * <p>
 * 1
 * / \
 * 2   3
 * <p>
 * 输出:6
 * <p>
 * 示例 2:
 * <p>
 * 输入:[-10,9,20,null,null,15,7]
 * <p>
 * -10
 * / \
 * 9  20
 * /  \
 * 15   7
 * <p>
 * 输出:42
 */

/**
 * Definition for a binary tree node
 */
class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode() {

    }

    TreeNode(int val) {
        this.val = val;
    }

    TreeNode(int val, TreeNode left, TreeNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}

/**
 * 递归实现
 */

class Solution {
    int result = Integer.MIN_VALUE;     // 用于保存结果
    public int maxPathSum(TreeNode root) {
        oneSideMax(root);
        return result;
    }

    private int oneSideMax(TreeNode root) {
        if (root == null) {
            return 0;
        }
        /**
         * 递归计算左右子节点的最大贡献值
         * 只有在最大贡献值大于0 时, 才会选取对应子节点
         */
        int left = Math.max(0,oneSideMax(root.left));
        int right = Math.max(0,oneSideMax(root.right));
        /**
         * 节点的最大路径和取决于该节点的值与该节点的左右子节点的最大贡献值
         * 更新答案
         */
        result = Math.max(result,left+right+ root.val);
        /**
         * 返回节点的最大贡献值
         */
        return root.val + Math.max(left, right);
    }
}

public class Study0124 {
    public static void main(String[] args) {
        TreeNode root = new TreeNode(1, new TreeNode(2, null, null), new TreeNode(3, null, null));
        System.out.println(new Solution().maxPathSum(root));
    }
}

结果:

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值