652. 寻找重复的子树

简介: #### [652. 寻找重复的子树](https://leetcode.cn/problems/find-duplicate-subtrees/)

一、题目描述:

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

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

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

示例 1:

img

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

img

输入:root = [2,1,1]
输出:[[1]]
示例 3:

img

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

提示:

树中的结点数在[1,10^4]范围内。
-200 <= Node.val <= 200

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-duplicate-subtrees
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

首先解决如何寻找重复的问题,要找重复的子树,如果重复了就保存一个树的根节点。这已经提示我们,遍历整棵树的所有节点,遍历的时候我们想办法得到以这个结点为根的子树的情况是什么样子的,显然用序列化二叉树,如何记录重复?这里我想到用哈希如果对应子树的序列出现次数超过1次那么就重复了,需要在结果中加入该子树的根结点。
再就是如何遍历树?我们知道树分三种遍历方式:前序,中序和后序,这三种都是深度优先搜索DFS。当然还有层次遍历,广度优先搜索BFS是可行的,

三、AC 代码:

class Solution {
    Map<String,Integer> tree = new HashMap();
    List<TreeNode> answer = new LinkedList<>();
    public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
        traverse(root);
        return answer;
    }
    private String traverse(TreeNode root) {
        if(root == null) {
            return "#";
        }
        //得到序列化后的左子树
        String leftTree = traverse(root.left);
        //得到序列化后的右子树
        String rightTree = traverse(root.right);
        String treeSub = root.val + "," + leftTree + "," + rightTree;
        int count = tree.getOrDefault(treeSub,0);
        //如果存在该子树
        if(count == 1) {
            answer.add(root);
        }
        //子树数量递增
        tree.put(treeSub,count+1);
        return treeSub;
    }
}
相关文章
|
存储 Java 芯片
探索计算机的I/O控制方式:了解DMA控制器的作用与优势
对于有科班背景的读者,可以跳过本系列文章。这些文章的主要目的是通过简单易懂的汇总,帮助非科班出身的读者理解底层知识,进一步了解为什么在面试中会涉及这些底层问题。否则,某些概念将始终无法理解。这些计算机基础文章将为你打通知识的任督二脉,祝你在编程领域中取得成功!
380 1
探索计算机的I/O控制方式:了解DMA控制器的作用与优势
|
分布式计算 Hadoop 大数据
【大数据开发技术】实验05-HDFS目录与文件的创建删除与查询操作
【大数据开发技术】实验05-HDFS目录与文件的创建删除与查询操作
326 0
|
人工智能 自然语言处理 物联网
中文LLaMA模型和指令精调的Alpaca大模型:中文数据进行二次预训练,进一步提升了中文基础语义理解能力
中文LLaMA模型和指令精调的Alpaca大模型:中文数据进行二次预训练,进一步提升了中文基础语义理解能力
中文LLaMA模型和指令精调的Alpaca大模型:中文数据进行二次预训练,进一步提升了中文基础语义理解能力
|
10月前
|
机器学习/深度学习 人工智能 数据可视化
小滑块上个斜面,难倒多少高中生?现在,AI让它动起来了
《Augmented Physics:基于机器学习的物理学习工具》 高中物理学习中,小滑块上斜面等问题常让学生困惑。Augmented Physics利用AI技术,将静态物理图示转化为交互式模拟,通过增强实验、动画图示、双向操作和参数可视化等技术,帮助学生直观理解物理概念。研究表明,该工具能有效提升学生对物理概念的理解,具备广阔的应用前景。
180 1
|
存储 分布式计算 监控
Hadoop在云计算环境下的部署策略
【8月更文第28天】Hadoop是一个开源软件框架,用于分布式存储和处理大规模数据集。随着云计算技术的发展,越来越多的企业开始利用云平台的优势来部署Hadoop集群,以实现更高的可扩展性、可用性和成本效益。本文将探讨如何在公有云、私有云及混合云环境下部署和管理Hadoop集群,并提供具体的部署策略和代码示例。
418 0
|
前端开发 JavaScript
HTML 转 Markdown 如此简单
本文推荐 HTML 转为 markdown 的工具和实现方式,并找到了一个快捷技巧,收藏等于学会。
2054 1
|
消息中间件 监控 Java
使用Java构建微服务架构的最佳实践
使用Java构建微服务架构的最佳实践
|
监控 API 网络安全
​邮件通知提醒邮箱警告设置教程及API代码示例
**摘要:** 在系统管理中,邮件通知提醒用于及时报告异常和重要事件。本文提供AOKSend的设置教程和API代码示例,教你如何配置邮件警告。通过自动化邮件通知,可以提升响应速度,确保系统稳定性。步骤包括注册AOKSend账户、获取API密钥、设置SMTP配置、创建触发条件及编写Python API代码示例。利用AOKSend API发送警告邮件,如CPU使用率过高通知,可有效监控和测试,确保系统异常时能快速响应。
|
存储 关系型数据库 MySQL
mysql 处理科学计数法的字段
【4月更文挑战第20天】
518 8
|
Java
SpringBoot配置图片访问404SpringBoot配置图片访问路径springboot如何访问图片
SpringBoot配置图片访问404SpringBoot配置图片访问路径springboot如何访问图片
194 0