Skip to content

Commit 0707d72

Browse files
authored
Create count-nodes-equal-to-average-of-subtree.py
1 parent 7e671bf commit 0707d72

File tree

1 file changed

+58
-0
lines changed

1 file changed

+58
-0
lines changed
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
# Time: O(n)
2+
# Space: O(h)
3+
4+
# Definition for a binary tree node.
5+
class TreeNode(object):
6+
def __init__(self, val=0, left=None, right=None):
7+
pass
8+
9+
10+
# dfs
11+
class Solution(object):
12+
def averageOfSubtree(self, root):
13+
"""
14+
:type root: Optional[TreeNode]
15+
:rtype: int
16+
"""
17+
def iter_dfs(root):
18+
result = 0
19+
stk = [(1, (root, [0]*2))]
20+
while stk:
21+
step, args = stk.pop()
22+
if step == 1:
23+
node, ret = args
24+
if not node:
25+
continue
26+
ret1, ret2 = [0]*2, [0]*2
27+
stk.append((2, (node, ret1, ret2, ret)))
28+
stk.append((1, (node.right, ret2)))
29+
stk.append((1, (node.left, ret1)))
30+
elif step == 2:
31+
node, ret1, ret2, ret = args
32+
ret[0] = ret1[0]+ret2[0]+node.val
33+
ret[1] = ret1[1]+ret2[1]+1
34+
result += int(ret[0]//ret[1] == node.val)
35+
return result
36+
37+
return iter_dfs(root)
38+
39+
40+
# Time: O(n)
41+
# Space: O(h)
42+
# dfs
43+
class Solution2(object):
44+
def averageOfSubtree(self, root):
45+
"""
46+
:type root: Optional[TreeNode]
47+
:rtype: int
48+
"""
49+
def dfs(node):
50+
if not node:
51+
return [0]*3
52+
left = dfs(node.left)
53+
right = dfs(node.right)
54+
return [left[0]+right[0]+node.val,
55+
left[1]+right[1]+1,
56+
left[2]+right[2]+int((left[0]+right[0]+node.val)//(left[1]+right[1]+1) == node.val)]
57+
58+
return dfs(root)[2]

0 commit comments

Comments
 (0)