652 寻找重复的子树
给你一棵二叉树的根节点 root ,返回所有 重复的子树 。对于同一类的重复子树,你只需要返回其中任意 一棵 的根结点即可。如果两棵树具有 相同的结构 和 相同的结点值 ,则认为二者是重复的。
输入:root = [1,2,3,4,null,2,4,null,null,4]
输出:[[2,4],[4]]
思路:
如果想要知道以当前节点为根的子树是不是重复的,需要知道以当前节点为根的子树长什么样子,也就是将当前节点为根的子树序列化。同时将所有节点为根的子树序列化,并将结果保存在一个map中(用map是因为需要记录相同序列化出现的次数,因为如上图中值为4的节点出现了三次,但是只需要记录一次,具体看代码吧)
序列化的方式:使用先序与后序都可以
CODE
class Solution {
public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
List<TreeNode> res = new ArrayList<>();
Map<String, Integer> map = new HashMap<>();
serialize(root, map, res);
return res;
}
private String serialize(TreeNode node, Map<String, Integer> map, List<TreeNode> list) {
if (node == null) {
return "#_";
}
String cur = node.val + "_";
String leftSerialize = serialize(node.left, map, list);
String rightSerialize = serialize(node.right, map, list);
String curSerialize = cur + leftSerialize + rightSerialize;
if (map.containsKey(curSerialize)) {
if (map.get(curSerialize) == 1) {
list.add(node);
}
map.put(curSerialize, map.get(curSerialize) + 1);
} else {
map.put(curSerialize, 1);
}
return curSerialize;
}
}