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

652 寻找重复的子树

给你一棵二叉树的根节点 root ,返回所有 重复的子树 。对于同一类的重复子树,你只需要返回其中任意 一棵 的根结点即可。如果两棵树具有 相同的结构 和 相同的结点值 ,则认为二者是重复的。
在这里插入图片描述

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值