返回
寻找最高分节点数:Leetcode 2049 解题解析
后端
2023-11-24 07:58:27
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 过程中,我们可以记录每个节点的子树权重之和,并在回溯的时候计算每个节点的最高分。
具体步骤如下:
- 首先,我们定义一个函数
dfs(node)
来进行 DFS。这个函数接受一个节点node
作为参数,并返回该节点的最高分。 - 在函数
dfs(node)
中,我们首先计算该节点的子树权重之和。我们可以使用 DFS 的方式来计算子树权重之和,也可以使用迭代的方式来计算。 - 然后,我们计算该节点的最高分。最高分等于该节点的权重加上其所有子树的最高分。
- 最后,我们返回该节点的最高分。
代码实现
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 解题思路,轻松计算最高分节点数。本文深入解析题意、算法流程与代码实现,助你快速提升算法技能。
希望这篇题解对你有帮助!如果你有任何问题,请随时留言。