2022-08-05每日一题 652 寻找重复的子树

652 寻找重复的子树

给你一棵二叉树的根节点 root ,返回所有 重复的子树 。对于同一类的重复子树,你只需要返回其中任意 一棵 的根结点即可。如果两棵树具有 相同的结构 和 相同的结点值 ,则认为二者是重复的。
2022-08-05每日一题 652 寻找重复的子树_第1张图片

输入: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;
    }

}

你可能感兴趣的:(leetcode,算法,数据结构,leetcode)