Skip to content

Commit 9c98310

Browse files
committed
feat: 834. Sum of Distances in Tree : 搜索
1 parent 6324ddd commit 9c98310

File tree

1 file changed

+53
-0
lines changed

1 file changed

+53
-0
lines changed
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/**
2+
* @param {number} n
3+
* @param {number[][]} edges
4+
* @return {number[]}
5+
*/
6+
const sumOfDistancesInTree = function (n, edges) {
7+
const e = Array(n).fill(0).map(() => [])
8+
for (const [x, y] of edges) {
9+
e[x].push(y)
10+
e[y].push(x)
11+
}
12+
const dist = Array(n).fill(1e10)
13+
const ans = []
14+
// 求每个节点到 0 的距离
15+
const dfs = (cur = 0, prev = -1, d = 0) => {
16+
dist[cur] = d
17+
for (const next of e[cur]) {
18+
if (next === prev) continue
19+
dfs(next, cur, d + 1)
20+
}
21+
}
22+
dfs()
23+
ans[0] = 0
24+
for (let i = 0; i < n; i++) ans[0] += dist[i]
25+
26+
const sz = Array(n).fill(0)
27+
// 求每个节点的子树大小
28+
const dfs1 = (cur = 0, prev = -1) => {
29+
let ans = 1
30+
for (const next of e[cur]) {
31+
if (next === prev) continue
32+
ans += dfs1(next, cur)
33+
}
34+
return sz[cur] = ans
35+
}
36+
dfs1()
37+
38+
// 对每个节点进行 re-root
39+
const dfs2 = (cur = 0, prev = -1) => {
40+
if (prev !== -1) {
41+
const a = sz[cur]
42+
const b = n - a
43+
ans[cur] = ans[prev] - a + b
44+
}
45+
for (const next of e[cur]) {
46+
if (next === prev) continue
47+
dfs2(next, cur)
48+
}
49+
}
50+
dfs2()
51+
52+
return ans
53+
}

0 commit comments

Comments
 (0)