834. Sum of Distances in Tree
An undirected, connected tree with N
nodes labelled 0...N-1
and N-1
edges
are given.
The i
th edge connects nodes edges[i][0]
and edges[i][1]
together.
Return a list ans
, where ans[i]
is the sum of the distances between node i
and all other nodes.
Example 1:
Input: N = 6, edges = [[0,1],[0,2],[2,3],[2,4],[2,5]]
Output: [8,12,6,10,10,10]
Explanation:
Here is a diagram of the given tree:
0
/ \
1 2
/|\
3 4 5
We can see that dist(0,1) + dist(0,2) + dist(0,3) + dist(0,4) + dist(0,5)
equals 1 + 1 + 2 + 2 + 2 = 8. Hence, answer[0] = 8, and so on.
Note: 1 <= N <= 10000
// Bottom-Up DFS Recursive Helper Function
void postOrder(vector<vector<int> >& tree, int cur, int pre, vector<int>& count, vector<int>& res) {
for (int i : tree[cur]) {
if (i == pre) continue;
postOrder(tree, i, cur, count, res);
count[cur] += count[i];
res[cur] += res[i] + count[i];
}
++count[cur]; // add the node itself
}
// Top-Down DFS Recursive Helper Function
void preOrder(vector<vector<int> >& tree, int cur, int pre, vector<int>& count, vector<int>& res) {
for (int i : tree[cur]) {
if (i == pre) continue;
res[i] = res[cur] - count[i] + count.size() - count[i];
preOrder(tree, i, cur, count, res);
}
}
vector<int> sumOfDistancesInTree(int N, vector<vector<int>>& edges) { // time: O(N); space: O(N)
// res: distance for each node
// count[i]: record how many nodes for a subtree rooted at i
vector<int> res(N), count(N);
vector<vector<int> > tree(N); // adjacency list
// Build the graph
for (const vector<int>& edge : edges) {
tree[edge[0]].push_back(edge[1]);
tree[edge[1]].push_back(edge[0]);
}
postOrder(tree, 0, -1, count, res);
preOrder(tree, 0, -1, count, res);
return res;
}
Last updated
Was this helpful?