IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【注释详细,思路清晰】【打卡第28天】leetcode热题HOT100之Java实现:124. 二叉树中的最大路径和【困难】 -> 正文阅读

[数据结构与算法]【注释详细,思路清晰】【打卡第28天】leetcode热题HOT100之Java实现:124. 二叉树中的最大路径和【困难】

1、题目描述

路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。路径和?是路径中各节点值的总和。给你一个二叉树的根节点?root?,返回其?最大路径和?。

?

?2、算法分析

首先,不要过分纠结递归的细节。课后可以一起探讨。

路径每到一个结点,有3种选择:1、停留在当前结点 2、走到左子树结点 3、走到右子树结点。当走到子结点的时候,又会面临着3种选择,递归就是用来处理规模不一样,但是过程相同的问题。

从父节点下来的路径,有三种情况:

① 路径停留在当前根节点,那么val:root.val

② 路径进入root的左子树,那么val:root.val + dfs(root.left)

③ 路径进图root的右子树,那么val:root.val + dfs(root.right)

那么三者的最大收益:root.val + Math.max(dfs(root.left),dfs(root.right))

注意:

(1)一条从父节点延伸下来的路径,不能走入左子树又掉头走右子树,不能两头收益,路径会重叠。

(2)当遍历到null节点时,null 子树提供不了收益,返回 0。

(3)如果某个子树 dfs 结果为负,走入它,收益不增反减,该子树应被忽略,杜绝选择走入它的可能,让它返回 0,像null一样,如同砍掉。、

子树中的内部路径要包含根节点:
由题意可知,最大路径和可能产生于局部子树中,如下图左一。

所以每递归一个子树,都求一下当前子树内部的最大路径和,如下图右一的绿色数值,从中比较出最大的。

注意: 一个子树内部的路径,要包含当前子树的根节点。如果不包含,那还算什么属于当前子树的路径,那就是当前子树的子树的内部路径了。

所以,一个子树内部的最大路径和 = 左子树提供的最大路径和 + 根节点值 + 右子树提供的最大路径和。即 dfs(root.left) + root.val + dfs(root.right)

?

?

3、代码实现

class Solution {
    int result = Integer.MIN_VALUE;
    public int maxPathSum(TreeNode root) {
        dfs(root);
        return result;
    }

    // 函数功能:返回当前节点能为父亲提供的贡献,需要结合上面的图来看!
    private int dfs(TreeNode root) {
        // 如果当前节点为叶子节点,那么对父亲贡献为 0
        if(root == null) return 0;
        // 如果不是叶子节点,计算当前节点的左右孩子对自身的贡献left和right
        int left = dfs(root.left);
        int right = dfs(root.right);
        // 更新最大值,就是当前节点的val 加上左右节点的贡献。
        result = Math.max(result, root.val + left + right);
        // 计算当前节点能为父亲提供的最大贡献,必须是把 val 加上!
        int max = Math.max(root.val + left, root.val + right);
        // 如果贡献小于0的话,直接返回0即可!
        return max < 0 ? 0 : max;
    }
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-16 11:59:24  更:2021-08-16 12:00:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:15:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码