【二叉树】Leetcode 124. 二叉树中的最大路径和【困难】

news/2024/7/24 7:31:33 标签: leetcode, 算法, java

二叉树中的最大路径和

  • 二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。

路径和 是路径中各节点值的总和。

给你一个二叉树的根节点 root ,返回其 最大路径和

示例1:
在这里插入图片描述
输入:root = [1,2,3]
输出:6
解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6

解题思路

这个问题可以使用递归解决,对于每个节点:

  • 1、以该节点为根的路径和(该路径和包括该节点,可能往左、往右、或者左右都有)。
  • 2、以该节点的左子树为起点的最大路径和。
  • 3、以该节点的右子树为起点的最大路径和。
  • 4、取这三者的最大值作为以当前节点为根的最大路径和。

Java实现

java">public class MaxPathSum {

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

    private int maxSum = Integer.MIN_VALUE;

    public int maxPathSum(TreeNode root) {
        maxPathSumHelper(root);
        return maxSum;
    }

    private int maxPathSumHelper(TreeNode node) {
        if (node == null) {
            return 0;
        }
//        10
//       /  \
//      2    10
//     / \     \
//    20  1     -25
//              / \
//             3   4

        // 计算以当前节点为根的路径和,可能包括左右子树
        int leftSum = Math.max(0, maxPathSumHelper(node.left));
        int rightSum = Math.max(0, maxPathSumHelper(node.right));

        // 更新全局最大路径和
        maxSum = Math.max(maxSum, leftSum + rightSum + node.val);

        // 返回以当前节点为根的路径和的最大值,注意不要包括左右子树
        return Math.max(leftSum, rightSum) + node.val;
    }

    // 示例测试
    public static void main(String[] args) {
        MaxPathSum solution = new MaxPathSum();

        // 构造二叉树
        TreeNode root = new TreeNode(10);
        root.left = new TreeNode(2);
        root.right = new TreeNode(10);
        root.left.left = new TreeNode(20);
        root.left.right = new TreeNode(1);
        root.right.right = new TreeNode(-25);
        root.right.right.left = new TreeNode(3);
        root.right.right.right = new TreeNode(4);

        int result = solution.maxPathSum(root);
        System.out.println(result); // 输出 42
    }
}

时间空间复杂度

  • 时间复杂度:O(N),其中 N 是二叉树中节点的数量,因为我们需要遍历每个节点。

  • 空间复杂度:O(H),其中 H 是二叉树的高度,因为递归调用栈的深度取决于二叉树的高度。


http://www.niftyadmin.cn/n/5467860.html

相关文章

Ubuntu20.04使用Neo4j导入CSV数据可视化知识图谱

1.安装JDK( Ubuntu20.04 JDK11) sudo apt-get install openjdk-11-jdk -y java -version which java ls -l /usr/bin/java ls -l /etc/alternatives/java ls -l /usr/lib/jvm/java-11-openjdk-amd64/bin/java确认安装路径为/usr/lib/jvm/java-11-openjd…

Array.from() 与 Array.reduce()

Array.from()方法就是将一个类数组对象或者可遍历对象转换成一个真正的数组 Array.reduce()方法对累加器和数组中的每个元素 (从左到右)应用一个函数,将其减少为单个值。 Array.from() // 那么什么是类数组对象呢?所谓类数组对象,最基本的要…

游戏租赁如何利用好闲鱼获客,实现月入10000单月游戏粉引流2000+

1. 个人名片与基本信息扩展 在宝贝85的闲鱼账号中,我们可以看到她的个人信息非常详细。作为一名00后的女生,她喜欢摄影,就读于长沙理工大学,并且拥有极好的芝麻信用。这些信息有助于增加买家的信任度,提高交易成功率。…

AGV无人驾驶跨境运输新模式引领未来物流

agv AGV即“自动导引运输车”,这一概念起源于欧美,在欧美及日韩市场的发展比较成熟,于上世纪末被引入国内。这种自动导引运输车可以广泛应用于汽车、化工、医药以及食品饮料等制造业场景,以及机场、码头等仓储物流行业场景&#x…

Pytorch_training2——network build+model (load+modify)

link import torchvision from torchvision import models resnet50 models.resnet50(pretrainedTrue) #pretrainedTrue 加载模型以及训练过的参数 print(resnet50) # 打印输出观察一下resnet50到底是怎么样的结构visit&modify nn_layer resnet50models.resnet50(pretr…

python 字符串写入 csv 被拆分问题

问题与现象 在使用csv的writerow或者writerows方法时,直接写入字符串会导致字符串被分割成一个字符占一个单元格的问题。 分析 查看writer源码,可以看到源码中的提示Iterable[Any],说明我们所写内容必须转化为列表 class _writer:dialect…

如何通过ArkTS卡片的Canvas自定义绘制能力实现五子棋游戏卡片

介绍 本示例展示了如何通过ArkTS卡片的Canvas自定义绘制能力实现一个简单的五子棋游戏卡片。 使用Canvas绘制棋盘和黑白棋子的落子。通过卡片支持的点击事件进行交互,让用户在棋盘上进行黑白棋子的对局。通过TS的逻辑代码实现五子棋输赢判定、回退等逻辑计算&…

idea开发 java web 酒店推荐系统bootstrap框架开发协同过滤算法web结构java编程计算机网页

一、源码特点 java 酒店推荐推荐系统是一套完善的完整信息系统,结合java web开发和bootstrap UI框架完成本系统 采用协同过滤算法进行推荐 ,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式…