核心思想是:序列化树
序列化后,用String可以唯一的代表一棵树,其实就是前序遍历改造一下(空节点用符号表示);
一边序列化,一边用哈希表记录有没有重复的,如果有就添加,注意不能重复添加。
重点就是序列化树,序列化得到的String可以唯一的代表一棵树,这个思想很多题都用到了
并不是只是前序遍历就能唯一表示一棵树,加上结构信息就可以了。
Map<String,TreeNode> map = new HashMap<>(); List<TreeNode> res = new ArrayList<>(); public List<TreeNode> findDuplicateSubtrees(TreeNode root) { serialize(root); return res; } public String serialize(TreeNode root) { StringBuilder s = new StringBuilder(); if (root==null) { s.append("#"); s.append(","); return new String(s); } s.append(root.val); s.append(","); s.append(serialize(root.left)); s.append(serialize(root.right)); String cur = new String(s); if (map.containsKey(cur)) { TreeNode t = map.get(cur); if (!res.contains(t)) res.add(t); } else map.put(cur,root); return cur; }