继续每日分享一道算法题,监督自己学习,不落下算法,有需要一起打卡的uu,可以一起加油呀!

好了,现在开始看题了哈:

给定一棵二叉树 root,返回所有重复的子树。

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

如果两棵树具有相同的结构和相同的结点值,则它们是重复的。

思路

首先我们看到是找相同的子树,我们是不是得先理解什么是两棵相同的子树。相同的子树,顾名思义,是不是就是两个子树的结点对应的节点都一样,比如看示例1,我们是不是很容易就可以发现上述图的子树2-4 是重复出现了两次,所以我们肯定是先想到,我只要进行暴力就好了呀,每一个结点都进行暴力查找。

这肯定是不行的嘛,所以我们就想办法把每个子树的结点都记录下来,这样通过次数就可以知道该子树是否有重新出现了嘛,所以嘛,我们肯定先想到哈希表来记录出现的次数。

那hash的key呢,我们怎么确定呢。我们可以通过递归遍历的序列来充当key值,这样就可以了哈。

看到这里了,看代码吗?还是先去AC?

查找重复的子树

代码

/**
*@author DY
*@date 2022/4/20
*/
class Solution { /*
* cnt记录序列化出现的次数
* ans保存重复出现的树节点
*/
Map<String,Integer> cnt ;
List<TreeNode> ans ;
public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
cnt = new HashMap<>();
ans = new LinkedList<>();
find(root);
return ans;
} public String find(TreeNode root){
//出口,叶子节点
if(root == null){
return "#";
}
//模板,先递归左子树,再递归右子树
String left = find(root.left);
String right = find(root.right);
// 这里记录的是子树的序列,当两个序列一样的时候,说明两个子树一样
String Ans = root.val+"."+left+"."+right;
// 获取当前这个子树的出现次数
int num = cnt.getOrDefault(Ans,0);
// 当这个子树已经出现后,我们直接将这个节点加入到重复出现的列表中
if(num ==1){
ans.add(root);
}
//更新当前子树的次数
cnt.put(Ans,num+1);
return Ans;
}
}

总结

这里就分享了一种做法,通过哈希记录+搜索,继续督促自己学习,加油!

LeetCode刷题之652寻找重复的子树的更多相关文章

  1. LeetCode 652: 寻找重复的子树 Find Duplicate Subtrees

    LeetCode 652: 寻找重复的子树 Find Duplicate Subtrees 题目: 给定一棵二叉树,返回所有重复的子树.对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可. 两 ...

  2. Java实现 LeetCode 652 寻找重复的子树(两个map的DFS)

    652. 寻找重复的子树 给定一棵二叉树,返回所有重复的子树.对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可. 两棵树重复是指它们具有相同的结构以及相同的结点值. 示例 1: 1 / \ ...

  3. Leetcode 652.寻找重复的子树

    寻找重复的子树 给定一棵二叉树,返回所有重复的子树.对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可. 两棵树重复是指它们具有相同的结构以及相同的结点值. 下面是两个重复的子树: 因此,你需 ...

  4. leetcode刷题笔记-3. 无重复字符的最长子串(java实现)

    题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "ab ...

  5. #leetcode刷题之路3-无重复字符的最长子串

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1:输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc" ...

  6. C#LeetCode刷题之#219-存在重复元素 II​​​​​​​(Contains Duplicate II)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3704 访问. 给定一个整数数组和一个整数 k,判断数组中是否存在 ...

  7. C#LeetCode刷题之#217-存在重复元素(Contains Duplicate)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3772 访问. 给定一个整数数组,判断是否存在重复元素. 如果任何 ...

  8. LeetCode刷题4:寻找两个正序数组的中位数

    题目: 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的 中位数 . 算法的时间复杂度应该为 O(log (m+n)) . 来源:力扣 ...

  9. LeetCode刷题总结-树篇(下)

    本文讲解有关树的习题中子树问题和新概念定义问题,也是有关树习题的最后一篇总结.前两篇请参考: LeetCode刷题总结-树篇(上) LeetCode刷题总结-树篇(中) 本文共收录9道题,7道中等题, ...

  10. C#LeetCode刷题-树

    树篇 # 题名 刷题 通过率 难度 94 二叉树的中序遍历   61.6% 中等 95 不同的二叉搜索树 II   43.4% 中等 96 不同的二叉搜索树   51.6% 中等 98 验证二叉搜索树 ...

随机推荐

  1. python学习记录(六)-系统内置模块

    序列化 什么是序列化?序列化是指把python中的数据以文本或二进制形式进行转换,还能反序列化为原来的数据 为什么需要序列化?便于数据在程序与网络之间的传输和存储 json:文本序列化 pickle: ...

  2. 腾讯云等Linux环境下Redis安装配置

    1.下载redis解压安装命令教程 https://www.cnblogs.com/hunanzp/p/12304622.html 2.配置远程连接 修改bind 127.0.0.0  为 bind ...

  3. centos7下安装Node.js MongoDB Nginx

     一.Node.js 方法1(笔者采用).如果对Node.js环境有比较高的要求,建议选择源码安装的方式进行安装,通过wget命令下载Node.js官网上的tar.gz文件包到centos服务器上,进 ...

  4. 11.8 消除闪烁(2)(harib08h)

    ps:看书比较急,有错误的地方欢迎指正,不细致的地方我会持续的修改 11.8 消除闪烁(2)(harib08h) 11.7 消除闪烁(1)(harib08g)存在的问题: 鼠标放在计时器上会有 闪烁, ...

  5. ARP协议:网络世界的临门一脚

    大家好,我是风筝. 各位同学肯定见过关于网络的面试题,什么TCP协议和UDP的区别啦,IP协议工作在哪层啊等等,这都是网络中定义的各种协议.这些标准化的协议就是网络分层模型标准化的核心部分.要想搞懂网 ...

  6. springboot--yaml数据读取的三种方式

    结果:

  7. dark room - 2020 年苹果设计奖得主,一个足够强大的照片视频编辑器

    2020年苹果设计奖得主 2015年App Store最佳应用 Darkroom 是一个高级照片和视频编辑器.它对业余摄影师来说很容易操作,但对专业摄影师来说足够强大. 下载 ➤ Darkroom 下 ...

  8. vue中使用vue.extend在dom挂载vue实例

    const CounterComponent = Vue.extend(Counter); this.vm = new CounterComponent({}).$mount('#container' ...

  9. VBA GET POST HTTP VBA网络爬虫 最新Excel自动获取股票信息源码 EXCEL自动获取网络数据 最新VBA自动抓取股票数据源码

    最新Excel自动获取股票信息源码 EXCEL自动获取网络数据 最新VBA自动抓取股票数据源码 通过接口获取股票数据内容的主要优点包括以下几点: 实时性高:通过访问股票数据接口,可以实时获取到股票的实 ...

  10. [Java EE] java.net.SocketException: Connection reset【解决中】

    1 错误描述 6:44:33.112] [DEBUG] [http-nio-9527-exec-3] [HttpClientUtil] http post url:http://bdp-gateway ...