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. 将该距离加到当前节点的距离之和中。
最终,我们得到一个计算结果,即树中所有节点的距离之和。