-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy path196_Apple_Most_Frequent_Subtree_Sum.py
More file actions
102 lines (65 loc) · 2.27 KB
/
196_Apple_Most_Frequent_Subtree_Sum.py
File metadata and controls
102 lines (65 loc) · 2.27 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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
"""
This problem was asked by Apple.
Given the root of a binary tree, find the most frequent subtree sum.
The subtree sum of a node is the sum of all values under a node, including the node itself.
For example, given the following tree:
5
/ \
2 -5
Return 2 as it occurs twice: once as the left leaf, and once as the sum of 2 + 5 - 5.
"""
from collections import defaultdict
class Node:
def __init__(self, data, left=None, right=None):
self.data: int = data
self.left: Node | None = left
self.right: Node | None = right
def is_leaf(self)->bool:
if self.left is None and self.right is None:
return True
return False
def __repr__(self):
if self.right:
fmt = f'{type(self).__name__}({self.data!r}, {self.left!r}, {self.right!r})'
elif self.left:
fmt = f'{type(self).__name__}({self.data!r}, {self.left!r})'
else:
fmt = f'{type(self).__name__}({self.data!r})'
# print(vars(self))
return fmt
def most_frequent_subtree_sum(node:Node):
sum_freq = defaultdict(int) # store sum:count
def post_order_sum(n:Node):
if n is None:
return 0
node_sum = post_order_sum(n.left) + post_order_sum(n.right) + n.data
sum_freq[node_sum] +=1
return node_sum
post_order_sum(node)
print(sum_freq)
# print(f"Most frequent subtree sum: {max(sum_freq, key=sum_freq.get)}")
return max(sum_freq, key=sum_freq.get)
if __name__ == '__main__':
root: Node = Node(
data=5,
left=Node(2),
right=Node(-5)
)
result = most_frequent_subtree_sum(root)
assert result == 2
print(f"Most frequent subtree sum: {result}")
root_2: Node = Node(
data=5,
left=Node(2, left=Node(5), right=Node(3)),
right=Node(-5, left=Node(5), right=Node(3))
)
result = most_frequent_subtree_sum(root_2)
assert result == 3
print(f"Most frequent subtree sum: {result}")
root_3: Node = Node(
data=1,
left=Node(2, left=Node(3)),
)
result = most_frequent_subtree_sum(root_3)
assert result == 3 # kinda random as all node sums will have the same frequency, depends on insertion order
print(f"Most frequent subtree sum: {result}")