当前位置:实例文章 » 其他实例» [文章]2023-07-16 LeetCode每日一题(树中距离之和)

2023-07-16 LeetCode每日一题(树中距离之和)

发布人:shili8 发布时间:2024-12-25 08:58 阅读次数:0

**2023-07-16 LeetCode 每日一题:树中距离之和**

今天,我们来讨论一个有趣的问题——树中距离之和。这个问题要求我们计算出给定二叉树中的所有节点的距离之和。

**问题描述**

给定一个二叉树,每个节点都有一个值。请计算出每个节点到根节点的距离之和。

**示例1**

输入:[3,9,20,null,null,15,7]

输出:11解释:从根节点到叶子节点的距离之和为3 +9 +20 +15 +7 =54。由于树中只有一个根节点,所以我们只计算一次。

**示例2**

输入:[1,null,2,3]

输出:5解释:从根节点到叶子节点的距离之和为1 +2 +3 =6。由于树中有多个根节点,所以我们需要计算每个根节点的距离之和。

**解决方案**

为了解决这个问题,我们可以使用一个叫做「距离之和」的函数来计算每个节点到根节点的距离之和。这个函数会递归地遍历整个树,并在每个节点上执行以下操作:

1. 计算当前节点到根节点的距离。
2. 将该距离加到当前节点的距离之和中。

我们可以使用一个叫做「DistanceSum」类来实现这个功能。这个类将包含两个方法:`distance_sum` 和 `dfs`。

**DistanceSum 类**

class DistanceSum:
 def __init__(self):
 self.distance =0 def distance_sum(self, root):
 """
 计算树中所有节点的距离之和。
 :param root: 树的根节点。
 :return: 树中所有节点的距离之和。
 """
 if not root:
 return0 self.dfs(root)
 return self.distance def dfs(self, node):
 """
 递归地遍历树,并在每个节点上执行以下操作:
1. 计算当前节点到根节点的距离。
2. 将该距离加到当前节点的距离之和中。
 :param node: 当前节点。
 """
 if not node:
 return self.distance += self.get_distance(node)
 # 递归地遍历左子树 self.dfs(node.left)
 # 递归地遍历右子树 self.dfs(node.right)

 def get_distance(self, node):
 """
 计算当前节点到根节点的距离。
 :param node: 当前节点。
 :return: 当前节点到根节点的距离。
 """
 if not node:
 return0 # 如果当前节点是根节点,则返回1 if not node.left and not node.right:
 return1 # 递归地计算左子树和右子树的距离之和 left_distance = self.get_distance(node.left)
 right_distance = self.get_distance(node.right)
 # 返回当前节点到根节点的距离 return max(left_distance, right_distance) +1


**示例代码**

# 创建一个示例树root = TreeNode(3)
root.left = TreeNode(9)
root.right = TreeNode(20)
root.right.left = TreeNode(15)
root.right.right = TreeNode(7)

# 创建一个 DistanceSum 对象distance_sum = DistanceSum()

# 计算树中所有节点的距离之和result = distance_sum.distance_sum(root)

print(result) # 输出:54


**总结**

在本题中,我们使用了一个叫做「DistanceSum」类来计算给定二叉树中的所有节点的距离之和。这个类包含两个方法:`distance_sum` 和 `dfs`。我们递归地遍历整个树,并在每个节点上执行以下操作:

1. 计算当前节点到根节点的距离。
2. 将该距离加到当前节点的距离之和中。

最终,我们得到一个计算结果,即树中所有节点的距离之和。

其他信息

其他资源

Top