-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path834.树中距离之和.py
More file actions
64 lines (53 loc) · 2.15 KB
/
834.树中距离之和.py
File metadata and controls
64 lines (53 loc) · 2.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#
# @lc app=leetcode.cn id=834 lang=python3
#
# [834] 树中距离之和
#
# @lc code=start
class Solution:
def sumOfDistancesInTree(self, N: int, edges: List[List[int]]) -> List[int]:
graph = [[] for _ in range(N)]
for edge in edges:
graph[edge[0]].append(edge[1])
graph[edge[1]].append(edge[0])
# init base case:nodeNum 为 1,distSum 为 0。
dist_sum = [0 for _ in range(N)]
node_num = [1 for _ in range(N)]
# eg [[1, 2], [0], [0, 3, 4, 5], [2], [2], [2]]
# 计算节点 所在的子树中的节点,与它的距离和
# from bottom to top 后序遍历
def post_order(node, parent):
for n in graph[node]:
if n == parent:
continue
post_order(n, node)
node_num[node] += node_num[n]
dist_sum[node] += dist_sum[n] + node_num[n]
'''
节点2所在的子树的节点个数为nodeNum[2],这nodeNum[2]个节点,从计算distSum[0]变成计算distSum[2]:从节点 0 到这些节点,变成从节点 2 到这些节点,每个节点都少走了一步,一共少走了nodeNum[2]步。
子树以外的节点呢,有N - nodeNum[2]个,从计算distSum[0]变成计算distSum[2]:从节点 0 到这些节点,变成从节点 2 到这些节点,每个节点都多走了一步,一共多走了N-nodeNum[2]步。
所以,我们找到distSum[i]与distSum[root]之间的递推关系:
distSum[i] = distSum[root] - nodeNum[i] + (N - nodeNum[i])
top to bottom 前序遍历
'''
def pre_order(node, parent):
for n in graph[node]:
if n == parent:
continue
dist_sum[n] = dist_sum[node] - node_num[n] + (N - node_num[n])
pre_order(n, node)
post_order(0, -1)
pre_order(0, -1)
return dist_sum
# @lc code=end
#
#
# edges = [[0,1],[0,2],[2,3],[2,4],[2,5]]
# N = 6
# graph = [[] for _ in range(N)]
# for edge in edges:
# graph[edge[0]].append(edge[1])
# graph[edge[1]].append(edge[0])
# dist_sum = [0 for _ in range(N)]
# node_num = [1 for _ in range(N)]
# print(graph)