二叉树最大路径和问题

二叉树,最大,路径,问题 · 浏览次数 : 48

小编点评

**二叉树最大路径和** **题目描述** 给定一个二叉树的根节点 `root` ,请返回其最大路径和。 **主要思路** 通过递归地访问树中的子节点,我们可以求得树的最大路径和。在每次递归过程中,我们记录当前路径和的最大路径和。当我们访问子节点时,如果其子树的路径和大于当前路径和,则更新当前路径和。最后,我们返回树的路径和最大路径和。 **代码** ```python class Info: def __init__(self, path, head): self.maxPathSum = path self.maxPathSumFromHead = head def maxPathSum(root: TreeNode) -> int: if root is None: return 0 # 递归处理左右子树 left_info = maxPathSum(root.left) right_info = maxPathSum(root.right) # 更新当前路径和最大路径和 maxPathSum = max(left_info.maxPathSum, right_info.maxPathSum) maxPathSum = max(maxPathSum, root.val + max(left_info.maxPathSum, right_info.maxPathSum)) return maxPathSum ``` **复杂度** 时间复杂度为 O(n),其中 n 是树的节点数。这是因为我们在每个节点上递归执行一次,并记录路径和的最大路径和。 **空间复杂度** 空间复杂度为 O(h),其中 h 是树的高度。这是因为我们在每个节点上递归执行一次,并记录路径和的最大路径和。

正文

二叉树最大路径和问题

作者:Grey

原文地址:

博客园:二叉树最大路径和问题

CSDN:二叉树最大路径和问题

题目描述

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

题目链接见: LeetCode 124. Binary Tree Maximum Path Sum

主要思路

本题使用二叉树递归套路方法,相关技巧见使用二叉树的递归套路来解决的问题

定义如下数据结构

  public static class Info {
  // 最大路径和
    public int maxPathSum;
    // 头结点一直往一侧扎,能扎到的最大值是多少
    public int maxPathSumFromHead;

    public Info(int path, int head) {
      maxPathSum = path;
      maxPathSumFromHead = head;
    }
  }

接下来定义递归函数

Info process(TreeNode head)

递归含义表示:head 为头的二叉树,得到的 Info 信息是什么。

主函数只需要调用

  public static int maxPathSum(TreeNode root) {
    if (root == null) {
      return 0;
    }
    return process(root).maxPathSum;
  }

即为要求的结果。

接下来就是process方法的实现,有如下几种情况

base case ,如果head == null,直接返回new Info(Integer.MIN_VALUE,Integer.MIN_VALUE),不赘述。

接下来找左右子树的信息

    Info leftInfo = process(head.left);
    Info rightInfo = process(head.right);

整合成以 head 为头的树的信息,

其中以 head 为头的树的maxPathSumFromHead变量有如下几种情况

  1. 只包含 head.val,这种情况暗示左右子树汇报的maxPathSumFromHead均为负数;

  2. 包含head.val和左子树的maxPathSumFromHead,这种情况暗示右子树的maxPathSumFromHead小于0,且左子树的maxPathSumFromHead大于0。

以上两种情况都可以归结为

int maxPathSumFromHead =
        head.val + Math.max(Math.max(leftInfo.maxPathSumFromHead, rightInfo.maxPathSumFromHead), 0);

以 head 为头的树的maxPathSum包含如下几种情况

  1. 只包含leftInfo.maxPathSum;

  2. 只包含rightInfo.maxPathSum;

  3. 只包含head.val + Math.max(0, leftInfo.maxPathSumFromHead) + Math.max(0, rightInfo.maxPathSumFromHead))

上述三种情况可以统一写成

int maxPathSum =
        Math.max(
            Math.max(leftInfo.maxPathSum, rightInfo.maxPathSum),
            head.val
                + Math.max(0, leftInfo.maxPathSumFromHead)
                + Math.max(0, rightInfo.maxPathSumFromHead));

完整代码见

class Solution {
   public static int maxPathSum(TreeNode root) {
    if (root == null) {
      return 0;
    }
    return process(root).maxPathSum;
  }

  // 任何一棵树,必须汇报上来的信息
  public static class Info {
    public int maxPathSum;
    public int maxPathSumFromHead;

    public Info(int path, int head) {
      maxPathSum = path;
      maxPathSumFromHead = head;
    }
  }

  public static Info process(TreeNode head) {
    if (null == head) {
      return new Info(Integer.MIN_VALUE, Integer.MIN_VALUE);
    }
    Info leftInfo = process(head.left);
    Info rightInfo = process(head.right);
    int maxPathSumFromHead =
        head.val + Math.max(Math.max(leftInfo.maxPathSumFromHead, rightInfo.maxPathSumFromHead), 0);
    int maxPathSum =
        Math.max(
            Math.max(leftInfo.maxPathSum, rightInfo.maxPathSum),
            head.val
                + Math.max(0, leftInfo.maxPathSumFromHead)
                + Math.max(0, rightInfo.maxPathSumFromHead));
    return new Info(maxPathSum, maxPathSumFromHead);
  }
}

更多

算法和数据结构笔记

与二叉树最大路径和问题相似的内容:

二叉树最大路径和问题

二叉树最大路径和问题 作者:Grey 原文地址: 博客园:二叉树最大路径和问题 CSDN:二叉树最大路径和问题 题目描述 路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。 路径

Solution -「LOJ #3310」丁香之路

首先有两个前置技巧:1) 两点间的最短距离就是直接连接两点的边的长度;2) 遍历一个子图的最小花费是最小生成树的边权之和乘二。原问题让我们找出一条最短且必经过钦定边的 \(( s, i )\) 路径,那么我们先将 \(\lang s , i \rang\) 连上,问题就变成了找出一条最短且必经过钦定

二叉树的最小深度问题

二叉树的最小深度问题 作者:Grey 原文地址: 博客园:二叉树的最小深度问题 CSDN:二叉树的最小深度问题 题目描述 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明:叶子节点是指没有子节点的节点。 题目链接见:LeetCode 111. Mini

相较于Scrum, 我更推崇精益Kanban,帮助团队建立价值交付流,识别瓶颈问题

> 最近在学习实践精益Kanban方法,结合自己团队实践Srum的经历,整理些资料二者的差异。相较于Scrum, 我更推崇精益Kaban。 Agile是一套理论和原则,就像天边的北极星。Devops是一种软件开发和运维团队间自动化和集成过程的方法。当实现Agile和Devops方法时,Kanban和

最短路径问题

最短路径问题 最短路问题是图论中一种重要的算法,本章将包括: 目录最短路径问题一.概念1.概念2.解决方案二. \(Flord\) 算法1.算法思想2.代码详解3.算法应用及局限性二. \(Djikstra\) 算法1.算法思想2.代码详解3.算法特征及其局限性三. \(Bellman-ford\)

Word2Vec模型总结

1.Huffman树的构造 解析:给定n个权值作为n个叶子节点,构造一棵二叉树,若它的带权路径长度达到最小,则称这样的二叉树为最优二叉树,也称Huffman树。数的带权路径长度规定为所有叶子节点的带权路径长度之和。Huffman树构造,如下所示: (1)将看成是有n颗树的森林; (2)在森林中选出两

leetcode 二叉树的最大深度

给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root = [3,9,20,null,null,15,7] 输出:3 示例 2: 输入:root = [1,null,2] 输出:2 解题思路 这里可以转化思路为

leetcode 二叉树的最小深度

给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明:叶子节点是指没有子节点的节点。 示例 1: 输入:root = [3,9,20,null,null,15,7] 输出:2 示例 2: 输入:root = [2,null,3,null,4,null,5,

VUE系列之性能优化--懒加载

一、懒加载的基本概念 懒加载是一种按需加载技术,即在用户需要时才加载相应的资源,而不是在页面初始加载时一次性加载所有资源。这样可以减少页面初始加载的资源量,提高页面加载速度和用户体验。 二、Vue 中的懒加载 在 Vue.js 中,懒加载主要用于路由组件的按需加载。Vue Router 提供了非常便

博客园商业之路:全园求偶遇,懂园子懂商业的创业合伙人

各方面的因素将园子的商业化强推到一个关口,2024年7月-9月是决定园子命运的一个季度,我们将拼尽所有力气找各种可能的突破口,不会有任何保留。 这个关口是最后关头,也是三年多来最好的时间窗口,天时地利最需要人和,找到对的人,最有可能在这个时间窗口,一将解园子二十年的商业化之愁。 园中(指博客园团队)