这个题解使用了深度优先搜索(DFS)和哈希表来查找重复的子树。主要思路如下:
1. 定义一个DFS函数,用于遍历二叉树的每个节点。
2. 对于每个节点,创建一个元组 `(node.val, dfs(node.left), dfs(node.right))`,表示以该节点为根的子树的结构。
3. 使用哈希表 `seen` 存储已遍历过的子树结构。如果当前子树结构已经在哈希表中出现过,说明找到了一个重复的子树,将其加入到输出集合 `output` 中。
4. 为了区分不同的子树结构,使用一个递增的索引 `idx`,为每个新的子树结构分配一个唯一的索引。
5. 最后返回输出集合 `output` 中的所有重复子树的根节点。
时间复杂度: O(n)
空间复杂度: O(n)
```python
# 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 dfs(node):
if not node: return 0
# 创建表示以当前节点为根的子树结构的元组
tri = (node.val, dfs(node.left), dfs(node.right))
if tri not in seen:
nonlocal idx
idx += 1
seen[tri] = (node, idx)
return idx
else:
(n, i) = seen[tri]
output.add(n)
return i
output = set() # 存储重复子树的根节点
seen = collections.defaultdict(list) # 存储已遍历过的子树结构
idx = 0 # 用于给新的子树结构分配唯一索引
dfs(root) # 执行深度优先搜索
return list(output)
```