题目地址:
https://www.lintcode.com/problem/1108/description
给定一棵二叉树,求其所有结构与值完全相同的子树,每种类型返回其中一个树根即可。
思路是序列化,DFS到某个节点的时候,序列化该子树,然后用哈希表计数。序列化的过程可以用分治来完成。代码如下:
import java.util.*;
public class Solution {
/**
* @paramn n: An integer
* @return: A list of root
*/
public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
// write your code here
List<TreeNode> res = new ArrayList<>();
dfs(root, new HashMap<>(), res);
return res;
}
private String dfs(TreeNode cur, Map<String, Integer> map, List<TreeNode> res) {
if (cur == null) {
return "#";
}
String s = String.valueOf(cur.val) + ' ' + dfs(cur.left, map,res) + ' ' + dfs(cur.right, map, res);
if (Objects.equals(map.put(s, map.getOrDefault(s, 0) + 1), 1)) {
res.add(cur);
}
return s;
}
}
class TreeNode {
int val;
TreeNode left, right;
public TreeNode(int val) {
this.val = val;
}
}
时间复杂度 O ( n log n ) O(n\log n) O(nlogn)(如果树高度不平衡,可能退化为 O ( n 2 ) O(n^2) O(n2)),空间 O ( n 2 ) O(n^2) O(n2)。