当前位置:实例文章 » 其他实例» [文章]Leetcode每日一题(困难):834. 树中距离之和(2023.7.16 C++)

Leetcode每日一题(困难):834. 树中距离之和(2023.7.16 C++)

发布人:shili8 发布时间:2024-12-24 07:59 阅读次数:0

**树中距离之和**

**难度:** 困难**描述:**

给定一棵二叉树的根节点 `root` 和两个整数 `L` 和 `R`,其中 `1 <= L <= R <=10^9`,计算从 `root` 到 `L` 或 `R` 的距离之和。

**示例1:**

输入:`root = [3,5,1,6,2,0,8,null,null,null,7,4], L =17, R =15`

输出:`23`

**示例2:**

输入:`root = [1], L =1, R =1`

输出:`1`

**提示:**

* `1 <= L <= R <=10^9`
* `root` 是一棵二叉树**解决方案:**

我们可以使用后序遍历(Postorder Traversal)来计算从根节点到每个叶子结点的距离之和。具体来说,我们将使用一个哈希表来存储每个叶子结点及其对应的距离。

cppclass Solution {
public:
 int sumOfDistancesInTree(TreeNode* root, int L, int R) {
 unordered_map distance;
 // 后序遍历计算从根节点到每个叶子结点的距离之和 postorderTraversal(root, distance);
 return distance[root] - (distance.find(L) != distance.end() ? distance[L] :0) - (distance.find(R) != distance.end() ? distance[R] :0);
 }
private:
 void postorderTraversal(TreeNode* node, unordered_map& distance) {
 if (!node) return;
 // 后序遍历计算从当前结点到每个叶子结点的距离之和 postorderTraversal(node->left, distance);
 postorderTraversal(node->right, distance);
 // 计算从当前结点到每个叶子结点的距离之和 int leftDistance = node->left ? distance[node->left] :0;
 int rightDistance = node->right ? distance[node->right] :0;
 // 更新哈希表中的值 distance[node] = leftDistance + rightDistance + (node == root ?1 :0);
 }
};


**注释:**

* 我们使用一个哈希表 `distance` 来存储每个叶子结点及其对应的距离之和。
* 后序遍历函数 `postorderTraversal` 计算从根节点到每个叶子结点的距离之和,并更新哈希表中的值。
* 最终,我们返回哈希表中根节点的距离之和,减去 L 和 R 的距离之和。

**时间复杂度:** O(N)

**空间复杂度:** O(N)

其他信息

其他资源

Top