📌  相关文章
📜  最大化 N 叉树中从根到叶节点的路径总和(1)

📅  最后修改于: 2023-12-03 15:26:24.788000             🧑  作者: Mango

最大化 N 叉树中从根到叶节点的路径总和

问题描述

给定一个 N 叉树,树中每个节点都包含一个整数值,现从根节点出发,需要求出一条从根节点到叶节点的路径,使得路径上的所有节点值的和最大。N 叉树定义如下:

class Node:
    def __init__(self, val=None, children=None):
        self.val = val
        self.children = children
解决方案

对于这个问题,我们可以采用深度优先搜索(DFS)的思路,从根节点开始遍历整棵树,计算出每个节点到根节点的路径和,并记录路径和的最大值。

我们可以定义一个递归函数 dfs(node, sum),其中 node 表示当前节点,sum 表示从根节点到当前节点的路径和。对于每个节点,我们遍历它的每个子节点,然后递归调用 dfs 函数计算它的子节点的路径和。最终,我们对所有路径和求最大值即可。

具体实现如下:

class Solution:
    def maxPathSum(self, root: 'Node') -> int:
        self.res = float('-inf')  # 初始化最大值为负无穷大

        def dfs(node, sum):
            if not node:  # 如果节点为空,返回
                return
            if not node.children:  # 如果节点是叶节点,更新最大值并返回
                self.res = max(self.res, sum + node.val)
                return
            for child in node.children:  # 遍历子节点
                dfs(child, sum + node.val)  # 递归调用 dfs 函数

        dfs(root, 0)  # 从根节点开始递归
        return self.res  # 返回最大值
复杂度分析
  • 时间复杂度:$O(N)$,其中 $N$ 是节点的总数。因为树中每个节点只会被遍历一次,所以时间复杂度为 $O(N)$。
  • 空间复杂度:$O(H)$,其中 $H$ 是树的高度。空间复杂度取决于递归深度,最坏情况下树为链式结构,递归深度为 $H$,空间复杂度为 $O(H)$。