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)

