LeetCode刷题之652寻找重复的子树
继续每日分享一道算法题,监督自己学习,不落下算法,有需要一起打卡的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寻找重复的子树的更多相关文章
- LeetCode 652: 寻找重复的子树 Find Duplicate Subtrees
LeetCode 652: 寻找重复的子树 Find Duplicate Subtrees 题目: 给定一棵二叉树,返回所有重复的子树.对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可. 两 ...
- Java实现 LeetCode 652 寻找重复的子树(两个map的DFS)
652. 寻找重复的子树 给定一棵二叉树,返回所有重复的子树.对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可. 两棵树重复是指它们具有相同的结构以及相同的结点值. 示例 1: 1 / \ ...
- Leetcode 652.寻找重复的子树
寻找重复的子树 给定一棵二叉树,返回所有重复的子树.对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可. 两棵树重复是指它们具有相同的结构以及相同的结点值. 下面是两个重复的子树: 因此,你需 ...
- leetcode刷题笔记-3. 无重复字符的最长子串(java实现)
题目描述 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "ab ...
- #leetcode刷题之路3-无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1:输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc" ...
- C#LeetCode刷题之#219-存在重复元素 II(Contains Duplicate II)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3704 访问. 给定一个整数数组和一个整数 k,判断数组中是否存在 ...
- C#LeetCode刷题之#217-存在重复元素(Contains Duplicate)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3772 访问. 给定一个整数数组,判断是否存在重复元素. 如果任何 ...
- LeetCode刷题4:寻找两个正序数组的中位数
题目: 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2.请你找出并返回这两个正序数组的 中位数 . 算法的时间复杂度应该为 O(log (m+n)) . 来源:力扣 ...
- LeetCode刷题总结-树篇(下)
本文讲解有关树的习题中子树问题和新概念定义问题,也是有关树习题的最后一篇总结.前两篇请参考: LeetCode刷题总结-树篇(上) LeetCode刷题总结-树篇(中) 本文共收录9道题,7道中等题, ...
- C#LeetCode刷题-树
树篇 # 题名 刷题 通过率 难度 94 二叉树的中序遍历 61.6% 中等 95 不同的二叉搜索树 II 43.4% 中等 96 不同的二叉搜索树 51.6% 中等 98 验证二叉搜索树 ...
随机推荐
- 调用d2l.plt.imshow(img)不报错、不显示图像的问题
解决方案: 加入如下所示的代码: import matplotlib.pyplot as plt d2l.plt.imshow(img) plt.show()
- vue +iview Select省市区联动
因为需要保存的表里只有City_id一个字段,所以这边只保存"区"的值 <Row type="flex" justify="start" ...
- Navicat 连接MySQL数据库 报错2059
Navicat 连接MySQL数据库 报错2059 - authentication plugin 'caching_sha2_password'的解决办法 2059 - Authentication ...
- 多线程JUC练习
package com.aliyun.test.learn; import java.util.concurrent.*; import java.util.concurrent.locks.Reen ...
- PHP 合并两个二维数组
思路:遍历二维数组,合并两个二维数组的值,赋值给新数组 function mergeArray($arr1,$arr2){ $newArr = []; foreach($arr1 as $v1){ f ...
- 随便记录一些使用IDEA在ssm阶段的踩过的坑
重命名中括号问题:需要重命名模块+目录 Intellij idea 报错:Error : java 不支持发行版本5_灵颖桥人的博客-CSDN博客_不支持发行版本5 idea中的目标字节码版本总是自动 ...
- jar包与war包的部署
前言 Spring Boot支持传统部署和更现代的部署形式.jar跟war都支持,这里参考springboot参考手册学习记录 传统部署:https://docs.spring.io/spring-b ...
- 在win10上装vmware虚拟机+ubuntu一打开就蓝屏重启怎么办?
一般就是虚拟机和系统一些性能不兼容导致的 因为我原来装的版本是15.0的vmware,现在重新装了16的vmware
- pip第三方库安装失败原因及解决办法
pip安装三方库失败原因及解决方法 提示:WARNING: You are using pip version 20.2.3, however version 20.2.4 is available. ...
- k8s namespace kubeDNS
图中kube-dns只是一个service,但是他对外提供k8s集群内部的dns服务,真正的dns server,是 coredns这几个pod k8s namespace 的作用只是提供逻辑上的组件 ...