# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def findDuplicateSubtrees(self, root: Optional[TreeNode]) -> List[Optional[TreeNode]]:
def same(node1, node2):
if not node1 and not node2:
return True
if not node1 or not node2:
return False
return (node1.val == node2.val and
same(node1.left, node2.left) and
same(node1.right, node2.right))
subTree = []
def dfs(root):
if not root:
return
subTree.append(root)
dfs(root.left)
dfs(root.right)
dfs(root)
res = []
seen = set()
for i in range(len(subTree)):
if subTree[i] in seen:
continue
for j in range(i + 1, len(subTree)):
if subTree[j] in seen:
continue
if same(subTree[i], subTree[j]):
if subTree[i] not in seen:
res.append(subTree[i])
seen.add(subTree[i])
seen.add(subTree[j])
return res# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def findDuplicateSubtrees(self, root: Optional[TreeNode]) -> List[Optional[TreeNode]]:
subtrees = defaultdict(list)
res = []
def dfs(node):
if not node:
return "null"
s = ",".join([str(node.val), dfs(node.left), dfs(node.right)])
if len(subtrees[s]) == 1:
res.append(node)
subtrees[s].append(node)
return s
dfs(root)
return res# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def findDuplicateSubtrees(self, root: Optional[TreeNode]) -> List[Optional[TreeNode]]:
id_map = {}
count = defaultdict(int)
res = []
def dfs(node):
if not node:
return -1
cur = (dfs(node.left), node.val, dfs(node.right))
if cur not in id_map:
id_map[cur] = len(id_map) + 1
curId = id_map[cur]
if count[curId] == 1:
res.append(node)
count[curId] += 1
return curId
dfs(root)
return res