Skip to content

Commit 46ad8fb

Browse files
authored
Create number-of-nodes-in-the-sub-tree-with-the-same-label.py
1 parent c0beed5 commit 46ad8fb

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
# Time: O(n)
2+
# Space: O(h)
3+
4+
class Solution(object):
5+
def countSubTrees(self, n, edges, labels):
6+
"""
7+
:type n: int
8+
:type edges: List[List[int]]
9+
:type labels: str
10+
:rtype: List[int]
11+
"""
12+
def iter_dfs(labels, adj, node, parent, result):
13+
stk = [(1, (node, parent, [0]*26))]
14+
while stk:
15+
step, params = stk.pop()
16+
if step == 1:
17+
node, parent, ret = params
18+
stk.append((4, (node, ret)))
19+
stk.append((2, (node, parent, reversed(adj[node]), ret)))
20+
elif step == 2:
21+
node, parent, it, ret = params
22+
child = next(it, None)
23+
if not child or child == parent:
24+
continue
25+
ret2 = [0]*26
26+
stk.append((2, (node, parent, it, ret)))
27+
stk.append((3, (ret2, ret)))
28+
stk.append((1, (child, node, ret2)))
29+
elif step == 3:
30+
ret2, ret = params
31+
for k in xrange(len(ret2)):
32+
ret[k] += ret2[k]
33+
else:
34+
node, ret = params
35+
ret[ord(labels[node]) - ord('a')] += 1
36+
result[node] += ret[ord(labels[node]) - ord('a')]
37+
38+
adj = [[] for _ in xrange(n)]
39+
for u, v in edges:
40+
adj[u].append(v)
41+
adj[v].append(u)
42+
result = [0]*n
43+
iter_dfs(labels, adj, 0, -1, result)
44+
return result
45+
46+
47+
# Time: O(n)
48+
# Space: O(h)
49+
import collections
50+
51+
52+
class Solution2(object):
53+
def countSubTrees(self, n, edges, labels):
54+
"""
55+
:type n: int
56+
:type edges: List[List[int]]
57+
:type labels: str
58+
:rtype: List[int]
59+
"""
60+
def dfs(labels, adj, node, parent, result):
61+
count = [0]*26
62+
for child in adj[node]:
63+
if child == parent:
64+
continue
65+
new_count = dfs(labels, adj, child, node, result)
66+
for k in xrange(len(new_count)):
67+
count[k] += new_count[k]
68+
count[ord(labels[node]) - ord('a')] += 1
69+
result[node] = count[ord(labels[node]) - ord('a')]
70+
return count
71+
72+
adj = [[] for _ in xrange(n)]
73+
for u, v in edges:
74+
adj[u].append(v)
75+
adj[v].append(u)
76+
result = [0]*n
77+
dfs(labels, adj, 0, -1, result)
78+
return result

0 commit comments

Comments
 (0)