Binary Tree part 3
2 min readFeb 26, 2020
https://leetcode.com/problems/count-univalue-subtrees/
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def countUnivalSubtrees(self, root: TreeNode) -> int:
self.res = 0
def helper(node):
if node is None:return True, None
ok, val = helper(node.left)
ok1, val1 = helper(node.right)
if ok and ok1 and (val is None or val==node.val) and (val1 is None or val1==node.val):
self.res += 1
return True, node.val
else:return False, -1
helper(root)
return self.res
In order fails in the following case
[0,0,0,0,null,null,0,null,null,null,0]
class Solution:
def findDuplicateSubtrees(self, root: TreeNode) -> List[TreeNode]:
d = collections.defaultdict(list)
def helper(node):
if node is None:return [None]
left = helper(node.left)
right = helper(node.right)
# in order fail
#values = left + [node.val] + right
# preorder works
#values = [node.val] +left + right
# postorder also works
values = left + right + [node.val]
d[tuple(values)].append(node)
return values
helper(root)
return [d[key][0] for key in d if len(d[key])>=2]
In order doesn’t work for this case
TreeA:
0
/
0
TreeB:
0
\
0
However, if we change left None to “(“, right None to “)”, all traverse will work.
For this example.
Tree A
In order: (0)0)
pre order: 00())
post order: ()0)0
Tree B:
in order: (0(0)
pre order: (0()0
post order: (()00
class Solution:
def findDuplicateSubtrees(self, root: TreeNode) -> List[TreeNode]:
d = collections.defaultdict(list)
def helper(node):
if node is None:return None
left = helper(node.left)
right = helper(node.right)
if left is None: left = ['(']
if right is None: right = [')']
values = left +[node.val]+ right
d[tuple(values)].append(node)
return values
helper(root)
return [d[key][0] for key in d if len(d[key])>=2]