File tree Expand file tree Collapse file tree 1 file changed +53
-0
lines changed Expand file tree Collapse file tree 1 file changed +53
-0
lines changed Original file line number Diff line number Diff line change
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
+ }
You can’t perform that action at this time.
0 commit comments