找到相同的子树,返回根节点
通过dfs,把所有的树都转化为一个String,然后map存储,得到答案。
关键点在于怎么判断两棵树相同,这里巧妙地把树转化为String,从而快速判断
public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
List<TreeNode> res = new LinkedList<>();
dfs(root, new HashMap<>(), res);
return res;
}
private String dfs(TreeNode root, HashMap<String, Integer> map, List<TreeNode> res) {
if (root == null) return "#";
String string = new StringBuilder().append(root.val).append(",").append(dfs(root.left, map, res)).append(",").append(dfs(root.right, map, res)).toString();
int cnt = map.getOrDefault(string, 0);
if (cnt == 1) res.add(root);
map.put(string, cnt + 1);
return string;
}