📅  最后修改于: 2023-12-03 15:11:40.487000             🧑  作者: Mango
给定一棵树,对于每个节点,用该节点及其子树中所有节点的权值之和作为该节点的权值。这棵树就被称为求和树。
我们需要求出任意两个加权节点之间的最小差。这个问题可以转化为先对求和树进行一次 DFS 遍历,然后再求最小的相邻节点之间的差值。
class Solution {
public:
vector<int> diff;
vector<bool> visited;
void dfs(TreeNode* node) {
visited[node->val] = true;
// 找到和当前节点最近的已访问节点
int d = 0;
for (int i = node->val + 1; i < visited.size(); i++) {
if (visited[i]) {
d = abs(node->val - i);
break;
}
}
diff[node->val] = d;
// 利用已访问节点更新答案
for (auto v : node->children) {
dfs(v);
diff[node->val] = min(diff[node->val], diff[v->val]);
}
}
vector<int> smallestDifference(TreeNode* root) {
int n = root->val;
visited.resize(n+1, false);
diff.resize(n+1, INT_MAX);
dfs(root);
return diff;
}
};
时间复杂度:O(n^2),其中 n 为节点数。每个节点会遍历它之后的所有节点,每轮需要 O(n) 的时间复杂度。
空间复杂度:O(n),其中 n 为节点数。需要额外开销 visited 和 diff 数组,它们的大小都为 n+1。