返回

寻找最高分节点数:Leetcode 2049 解题解析

后端

LeetCode 2049 题意解析

给你一棵二叉树的根节点 root,其中包含 n 个节点。每个节点的权重 weight 为一个整数。权重为 0 的节点表示已删除节点,权重为非零的节点表示现存节点。

对于现存节点,你可以在以下两个动作中选择一个:

  • 将一个现存节点删去,得到 0 点权重。
  • 将一个现存节点的权重增加 1,得到 权重 + 1 的节点。

请你返回可以得到的最高分。节点的得分定义为所有现存子树的权重之和。

示例 1:

输入:root = [1,2,3,4,5,6,7]
输出:19
解释:最高得分为 19,下面是得到最高得分的移除节点方案:
- 移除节点 3 并将节点 4  5 的权重增加 1,得到节点 [1,2,4,5,6,7],总权重为 16
- 移除节点 2 并将节点 1 的权重增加 1,得到节点 [1,4,5,6,7],总权重为 18
- 移除节点 1 并将节点 4、5 和 7 的权重增加 1,得到节点 [4,5,6],总权重为 19

示例 2:

输入:root = [4,3,2,7,5,1]
输出:20
解释:最高得分为 20,下面是得到最高得分的移除节点方案:
- 移除节点 2 和 3,得到节点 [4,7,5,1],总权重为 17
- 移除节点 4,得到节点 [7,5,1],总权重为 13
- 移除节点 5,得到节点 [7,1],总权重为 8
- 移除节点 7,得到节点 [1],总权重为 1
- 移除节点 1,得到节点 [],总权重为 0

算法思路

这道题的难点在于如何求出每个节点删除后的子树权重之和,以及如何通过递归的方法计算每个节点的最高分。

我们可以使用深度优先搜索 (DFS) 来求出每个节点删除后的子树权重之和。在 DFS 过程中,我们可以记录每个节点的子树权重之和,并在回溯的时候计算每个节点的最高分。

具体步骤如下:

  1. 首先,我们定义一个函数 dfs(node) 来进行 DFS。这个函数接受一个节点 node 作为参数,并返回该节点的最高分。
  2. 在函数 dfs(node) 中,我们首先计算该节点的子树权重之和。我们可以使用 DFS 的方式来计算子树权重之和,也可以使用迭代的方式来计算。
  3. 然后,我们计算该节点的最高分。最高分等于该节点的权重加上其所有子树的最高分。
  4. 最后,我们返回该节点的最高分。

代码实现

def countHighestScoreNodes(root):
    """
    :type root: TreeNode
    :rtype: int
    """
    def dfs(node):
        if not node:
            return 0, 0

        left_sum, left_max = dfs(node.left)
        right_sum, right_max = dfs(node.right)

        total_sum = left_sum + right_sum + node.val
        max_score = max(left_max, right_max, total_sum)

        return total_sum, max_score

    _, max_score = dfs(root)
    return max_score

复杂度分析

  • 时间复杂度:O(N),其中 N 为二叉树的节点数。这是因为 DFS 算法需要遍历二叉树中的每个节点。
  • 空间复杂度:O(H),其中 H 为二叉树的高度。这是因为 DFS 算法需要在递归调用时保存每个节点的状态。

结语

掌握 LeetCode 2049 题,掌握 DFS 解题思路,轻松计算最高分节点数。本文深入解析题意、算法流程与代码实现,助你快速提升算法技能。

希望这篇题解对你有帮助!如果你有任何问题,请随时留言。