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_mapdistance; // 后序遍历计算从根节点到每个叶子结点的距离之和 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)