File tree 2 files changed +48
-2
lines changed
2 files changed +48
-2
lines changed Original file line number Diff line number Diff line change
1
+ # 给定树结构,获得以所有节点为根时对应的树的深度,结果以列表返回
2
+ def get (edges : List [List [int ]]) -> List [int ]:
3
+ n = len (edges ) + 1
4
+ g = [[] for _ in range (n )]
5
+ for x , y in edges :
6
+ g [x ].append (y )
7
+ g [y ].append (x )
8
+
9
+ # f[i] 当前节点为根时的最大深度和次大深度
10
+ f = [[0 , 0 ] for _ in range (n )]
11
+
12
+ # 当前树直径
13
+ def dfs (u , fa ):
14
+ max_len = 0
15
+ second_len = 0
16
+ for v in g [u ]:
17
+ if v == fa : continue
18
+ d = dfs (v , u ) + 1
19
+ if d >= max_len :
20
+ second_len = max_len
21
+ max_len = d
22
+ elif d > second_len :
23
+ second_len = d
24
+ f [u ] = [max_len , second_len ]
25
+ return max_len
26
+
27
+ dfs (0 , - 1 )
28
+
29
+ # 所有节点中最大深度的最小值
30
+ mnd = inf
31
+ def rdfs (u , fa ):
32
+ nonlocal mnd
33
+ # 最大深度,次大深度
34
+ mx , smx = f [u ]
35
+ mnd = min (mx , mnd )
36
+ for v in g [u ]:
37
+ if v == fa : continue
38
+ # 如果当前v的最大深度 + 1刚好是它父亲u的最大深度,那么不能通过最大深度来更新,而是应该通过次大深度更新
39
+ t = smx if f [v ][0 ] + 1 == mx else mx
40
+ if t + 1 >= f [v ][0 ]: # 大于最大,更新最大和次大
41
+ f [v ][1 ], f [v ][0 ] = f [v ][0 ], t + 1
42
+ elif t + 1 > f [v ][1 ]: # 大于次大,只需要更新次大
43
+ f [v ][1 ] = t + 1
44
+ rdfs (v , u )
45
+
46
+ rdfs (0 , - 1 )
47
+
48
+ return [d for d , _ in f ]
Original file line number Diff line number Diff line change @@ -29,8 +29,6 @@ def dfs(u, fa):
29
29
30
30
31
31
# 只记录最长
32
-
33
-
34
32
class Solution :
35
33
def treeDiameter (self , edges : List [List [int ]]) -> int :
36
34
n = len (edges ) + 1
You can’t perform that action at this time.
0 commit comments