题目

给你一棵二叉树的根节点 root ,返回所有 重复的子树 。


对于同一类的重复子树,你只需要返回其中任意 一棵 的根结点即可。


如果两棵树具有 相同的结构 和 相同的结点值 ,则认为二者是 重复 的。


 


示例 1:




输入:root = [1,2,3,4,null,2,4,null,null,4]

输出:[[2,4],[4]]

示例 2:




输入:root = [2,1,1]

输出:[[1]]

示例 3:




输入:root = [2,2,2,3,null,3,null]

输出:[[2,3],[3]]

代码实现

class Solution {
    Map<String, TreeNode> seen = new HashMap<String, TreeNode>();
    Set<TreeNode> repeat = new HashSet<TreeNode>();

    public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
        dfs(root);
        return new ArrayList<TreeNode>(repeat);
    }

    public String dfs(TreeNode node) {
        if (node == null) {
            return "";
        }
        StringBuilder sb = new StringBuilder();
        sb.append(node.val);
        sb.append("(");
        sb.append(dfs(node.left));
        sb.append(")(");
        sb.append(dfs(node.right));
        sb.append(")");
        String serial = sb.toString();
        if (seen.containsKey(serial)) {
            repeat.add(seen.get(serial));
        } else {
            seen.put(serial, node);
        }
        return serial;
    }
}

·