LeetCode Notes_#652_寻找重复的子树
Contents
题目
给定一棵二叉树,返回所有重复的子树。对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。
两棵树重复是指它们具有相同的结构以及相同的结点值。
示例 1:
1
/
2 3
/ /
4 2 4
/
4
下面是两个重复的子树:
2
/
4
和
4
因此,你需要以列表的形式返回上述重复子树的根结点。
思路分析
每个结点都对应着一棵子树,但是TreeNode
类型是一个自定义类型,不可以直接比较两个TreeNode
结构是否相同。
所以考虑将每个节点对应的子树进行序列化,然后将序列化结果作为键存入HashMap
,值是这个序列出现的次数。
那么就需要写一个序列化的函数serialize
,这个过程其实就是跟树的DFS
遍历是类似的。
需要注意的是:
- 序列化时必须要把
null
节点也算上,否则可能无法区分两个不同的子树。 - 不可以用中序遍历方式进行序列化,原因如下图。
解答
class Solution {
List<TreeNode> result = new LinkedList<>();
Map<String, Integer> map = new HashMap<>();
public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
if(root == null) return result;
serialize(root);
return result;
}
private String serialize(TreeNode root){
if(root == null) return "null";
String str = root.val + "," + serialize(root.left) + "," + serialize(root.right);
map.put(str, map.getOrDefault(str, 0) + 1);
if(map.get(str) == 2) result.add(root);
return str;
}
}
复杂度分析
N是树中节点的个数。
时间复杂度:O(N2)
空间复杂度:O(N2)