leetcode 652. Find Duplicate Subtrees(找出重复的子树)

LabVIEW+数据库应用系列保姆级教程,第一篇数据库连接 目录LabVIEW连接数据库的方法连接MySQL连接Oracle,SQL Server,Access等 LabVIEW连接数据库的方法 1、创建udl(Universal Data Link)是通用数据连接文件。界面操作,简单快捷。 2、编写连接字符串。需要熟悉连接字符串的结构,容易出错。 3、其他… 本教程教你使用第1种方法,也是最简单、最常用的方法。 连接MySQL 1、在MySQL Installer内安装MySQL Connector/ODBC,建议安装32位(X86),如下图: 2、创建ODBC 阅读详情

Given the root of a binary tree, return all duplicate subtrees.

For each kind of duplicate subtrees, you only need to return the root node of any one of them.

Two trees are duplicate if they have the same structure with the same node values.

Example 1:
在这里插入图片描述
Input: root = [1,2,3,4,null,2,4,null,null,4]
Output: [[2,4],[4]]

给出一个二叉树,找出其中相同的子树,相同的子树是指相同的节点值,相同的结构,多个重复的只需返回一个,返回root节点即可。

思路:

如果遍历到每一个节点都可以返回这个节点下面的树结构和值的组合(具有唯一性),即可以迅速判断是不是同一棵子树。序列化有这个唯一性,可以用序列化解决。

1.用String保存序列化

树的结构需要区分root, 左子树,右子树,
其中值的部分用数字,然后用"#"分割root, 左子树和右子树:key = root.val # left # right
所以用树的后序遍历来获得左子树和右子树的序列化。

当key相同时,说明是相同的两个子树,记录下每个子树已经出现的次数。
出现第2次时证明相同,加入list。后面再出现时不需要再重复记录。

class Solution {
    public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
        HashMap<String, Integer> map = new HashMap<>();
        List<TreeNode> res = new ArrayList<>();
        postOrder(root, map, res);
        return res;
    }

    String postOrder(TreeNode root, HashMap<String, Integer> map, List<TreeNode> res) {
        if(root == null) return "";

        String left = postOrder(root.left, map, res);
        String right = postOrder(root.right, map, res);
        String key = left + "#" + right +"#" + root.val;
        int cnt = map.getOrDefault(key, 0);
        if(cnt == 1) res.add(root);
        map.put(key, cnt+1);
        return key;
    }
}

2.用long型保存序列化

用String的方法比较容易理解,但是不够快。
看到网上有个更快的方法,它是用long型保存一棵二叉树,其中高位32位到16位保存root,中间16位保存左子树,下面16位保存右子树,这样每个树可形成一个long型的key。
但是这里有个问题,方法1中作为key的String可以无限拉长,但是这里不行,如果root有很多子树,key多次左移位就会超出long型的范围。
要防止这种情况发生,就要每个key对应一个id, 移位的时候是id移位而不是key本身移位。
所以每个key又需要对应一个id,
同时还需要记录这个结构出现的次数,即id还要对应一个count。

所以需要两个hashMap,一个保存<key, id>, 一个保存<id, count>
root的id是0,[2,4]的id是1,[4]的id是2,当出现下一个[2,4]时,通过计算key找到相同的id是1,再通过id找到count,一旦count == 2,说明之前出现过一次,保存进结果即可,count>2的就不需要再保存了。

同时注意root的值保存进key时必须要cast到long型,因为它要左移32位,如果直接用int,会溢出。
另外count要先+1再判断是否 == 2. 而不是直接判断是不是 == 1,因为有些出现过1次但是和本次的key并不相同的也会算进去。

如果不是特别追求快(80%和98%的差别),建议方法1,更易于理解。

//6ms
    public List<TreeNode> findDuplicateSubtrees(TreeNode root) {
        List<TreeNode> result = new ArrayList<>();
        if(root == null) return result;
        
        HashMap<Long, Integer> ids = new HashMap<>();
        HashMap<Integer, Integer> count = new HashMap();
        getId(root, ids, count, result);
        
        return result;
    }
    
    int getId(TreeNode root, HashMap<Long, Integer> ids,
             HashMap<Integer,Integer> count, List<TreeNode> result) {
        if(root == null) return 0;
        
        long key = ((long)root.val << 32 | getId(root.left, ids, count, result) << 16 |
            getId(root.right, ids, count, result));
        int id = 0;
        
        if(ids.get(key) != null) {
            id = ids.get(key);
        } else {
            id = ids.size() + 1;
        }
        
        ids.put(key, id);
        count.put(id, count.getOrDefault(id, 0)+1);
        if(count.get(id) == 2) {
            result.add(root);
        }
        
        return id;
    }

参考资料

从 SEGW 到 SADL 的那根线,彻底理解 OData Data Source Mapping 本文摘要(150字): 在SAP Gateway的SADL型OData服务开发中,"Map to Data Source"是关键配置环节。与传统RFC映射不同,SADL映射不是针对单个CRUDQ操作,而是建立OData模型与SADL业务实体间的完整语义对应关系。通过属性映射和关联映射,系统能自动处理数据获取和导航请求。映射编辑器支持三种模式:属性映射处理字段对应,关联映射处理模型间关系,动作映射处理业务操作。映射的本质是建立语义翻译表,决定了后续OData请求如何转化为后端业务实体访问,而非简单的字段重命名 阅读详情

相关推荐

MOSFET导通电阻Rdson全解析:物理组成、公式推导与工程选型要点

在功率电子设计中,MOSFET作为核心开关器件,其导通电阻Rdson直接决定导通损耗与系统效率。从半导体物理角度看,Rdson并非单一固定值,而是由源极电阻、沟道电阻、累积层电阻、JFET区电阻、漂移区电阻及衬底电阻等多个分量串联而成,并随栅极驱动电压、结温以及击穿电压等级发生显著变化。理解Rdson的物理来源与数学表达,有助于工程师在低压大电流与高压小电流等不同场景中合理选型、优化驱动电压并准确估算热损耗。文章从沟道电阻公式出发,深入剖析耐压与导通电阻的物理矛盾、温度系数的影响规律,并给出数据手册参数的正

weixin_29163857的博客 195

重复子树查找(Find Duplicate Subtrees)

参考:https://blog.csdn.net/CsWarmSun/article/details/112410914

qq_24505417的博客 461

Windows 11 下 WSL 离线安装 Ubuntu 22.04 保姆级教程(国内镜像加速版)

本文提供了一份针对中国地区用户的Windows 11下WSL离线安装Ubuntu 22.04的详细教程。通过使用国内镜像源加速下载安装包,并配合PowerShell命令完成部署,有效解决了官方商店下载缓慢的问题。教程涵盖环境准备、离线包获取、安装初始化及安装后的关键优化配置,帮助用户快速搭建高效的Linux开发环境。

weixin_28452161的博客 1378

Leetcode 652. Find Duplicate Subtrees 寻找重复子树 解题报告

这道题,给了一个二叉树,然后需要找出所有重复的子树(注意这个子树返回一个就可以了)做法naive一点可以记录每个node的值,然后比较相同的值的遍历。。 进阶一点的话,可以记录以每个节点为开始时的先序遍历(中左右)的数值,然后遍历的序列如果重复出现了,那么就自然可以加入了以上问题等价于: 记录每一颗子树的先序/后序便利结果,然后比较看有没有重复的,有重复的就可以加入PS:后续遍历也可以,只要别让

MebiuW的专栏 4428

从FSI到三层堆叠:一文搞懂车载CIS图像传感器技术演进与选型避坑

本文深入解析车载CIS图像传感器从FSI到三层堆叠的技术演进,揭示不同结构在低光性能、HDR表现和温度稳定性上的关键差异。通过实测数据对比,指导智能驾驶系统选型策略,帮助开发者规避成本与性能的常见陷阱,提升车载摄像头在复杂环境下的成像质量。

weixin_30689307的博客 101

WordPress搭建“外贸独立站”完整操作教程

  以往的文章,我们介绍了很多种搭建独立站的方式,有最省事的Shopify 、最专业的Magento以及最省钱的Wordpress Woocommerce。其中,通过主机托管的方式又分了免费的谷歌云vps主机、1美元Godaddy主机以及SiteGround共享主机三种。建站方法方式实在太多了,有免费的,有廉价的,有商业版的,有共享主机、有云主机主机以及各种各样的vps服务器,选择哪种方式,哪款主机,也只有真正试了才直到。   没错,上述的这些方法方式,无一例外,我都亲身折腾过。从个人实际需求和建站方式来

www25qi的博客 8079

Leetcode 652. 寻找重复的子树

将所有二叉树子树序列化成字符串然后利用哈希表统计出现过的二叉树序列如果出现重复的那么就将该节点插入答案序列。(二叉树序列化其实就是按照某种顺序输出二叉树节点的值)需要注意的细节是,节点的取值是多位数,因此不能直接使用加法连接,而是要在中间加上括号来识别序列。对于同一类的重复子树,你只需要返回其中任意。给你一棵二叉树的根节点。

eihh23333的博客 234

从仿真到实体:基于Isaac Gym的X20机械狗与Kinova Gen3 Lite机械臂全身协同控制实战

本文详细介绍了基于Isaac Gym仿真平台,实现云深处X20机械狗与Kinova Gen3 Lite机械臂全身协同控制的完整实战流程。内容涵盖环境搭建、模型适配、分阶段训练策略、域随机化技巧,以及最终将训练好的策略安全部署到实体机器人的关键步骤,为复杂机器人系统的仿真到实体迁移提供了宝贵经验。

yhn45678901的博客 489

华为机试2022.3.30:寻找完全相同的子树

第三道题,300分,二叉树的考点。 题目描述 在一颗二叉树中找出完全相同的两颗子树(子树层数必须大于或者等于2)。如果存在多对子树完全相同,请返回层数最大的子树;如果不存在即输出“-1"。 输入描述 一个数组,表示一颗二叉树,数组元素按层序排布,不存在的节点,用null 表示,每个节点的值在(0,10)之间,不包含0和10。二叉树层数小于5 输出描述 完全相同的子二叉树对应的数组(不包含只有一个节点的子树),子树可以位于不同的层次 样例1 输入: [1,2,3,1,null,2,null,null,null

小朱小朱绝不认输的博客 2539

Linux内核配置选项详解及编译过程

在内核编译完成后,可以通过重启系统并选择新编译的内核来使用它。可以在该菜单下选择需要编译进内核的设备驱动,也可以选择将设备驱动编译为模块。可以在该菜单下选择需要编译进内核的设备驱动,也可以选择将设备驱动编译为模块。可以选择需要的调试选项,并根据需要启用或禁用相应的功能。可以选择需要的文件系统类型,并根据需要启用或禁用相应的选项。可以选择需要的网络协议和功能,并根据需要启用或禁用相应的选项。可以选择需要的调试选项,并根据需要启用或禁用相应的功能。可以选择需要的文件系统类型,并根据需要启用或禁用相应的选项。

TechGlide的博客 746

基于C++和Qt开发IEC104规约主站调试软件(第二章)

本章节主要讲解iec104主站软件界面设计和从站的连接功能以及部分功能代码的展示。

半青年的博客 858

652. Find Duplicate Subtrees

思路:最暴力的办法是遍历整棵树,每遇到一个节点重新遍历树,寻找是否有与其相同的子树结构。时间复杂度是O(n^3)。因此,为简化时间复杂度,可以在遍历时将其转化成字符串数组保存起来,每次遍历到新节点只需比较是否有与其相同的字符串即可。时间复杂度简化为O(n^2)。用hashmap来保存字符串,value的值记录字符串出现的次数,只有曾经出现一次时才将子树根节点的指针保存在结果中,避免具有3个或3个以上相同子树结构时结果重复。题目:给定一个二叉树,求里面完全相同的子树。返回子树根节点的集合。

qing2019的博客 410

在 SAP 中,寄售业务(Consignment)与管道业务(Pipeline)都属于“物料先到、发票后到”的特殊采购模式,但两者的库存形态、物权转移时点、结算触发条件、系统配置完全不同

SAP中寄售业务与管道业务均属"先货后票"采购模式,但存在本质差异。寄售业务(如手机芯片)采用实物库存管理(标记"K"),物权在领用时转移,通过411K/201K移动类型触发负债;管道业务(如蒸汽)无实物库存,采用261P等移动类型直接消耗并生成应付。系统配置上,寄售需K类信息记录及GR收货,管道需P类信息记录且免GR。两者均通过MRKO汇总结算,但寄售按领用量计费,管道按提取量实时计费。核心区别在于库存形态与物权转移时点。

金牌架构师 557

LeetCode知识点总结 - 652

LeetCode 652. Find Duplicate Subtrees

m0_59773145的博客 413

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

LeetCode //C - 652. Find Duplicate Subtrees

【代码】LeetCode //C - 652. Find Duplicate Subtrees。

Made in Code 1267

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

[leetcode]652. Find Duplicate Subtrees(Python)

[leetcode]652. Find Duplicate Subtrees题目描述题目理解解题思路Time 题目描述 Category:Mediudm Tree Given a binary tree, return all duplicate subtrees. For each kind of duplicate subtrees, you only need to return the ...

La_Ragazza的博客 394

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

leetcode 652. find-duplicate-subtrees 寻找重复的子树 python3

时间:2020-9-10 题目地址:https://leetcode-cn.com/problems/find-duplicate-subtrees/ 题目难度:Medium 题目描述: 给定一棵二叉树,返回所有重复的子树。对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。 两棵树重复是指它们具有相同的结构以及相同的结点值。 示例 1: 1 / \ 2 3 / / \ 4 2 4 / ...

isabloomingtree的博客 328

LeetCode(652):寻找重复的子树 Find Duplicate Subtrees(Java)

2019.11.12 #程序员笔试必备# LeetCode 从零单刷个人笔记整理(持续更新) github:https://github.com/ChopinXBP/LeetCode-Babel 这题需要借助哈希表对已遍历的子树进行存储,为了避免重复计算,哈希表选取的key值可以选取序列化后的二叉树,通过后序遍历递归进行。 传送门:寻找重复的子树 Given a binary tree, re...

NJU_ChopinXBP的博客 270

[LeetCode] 652. Find Duplicate Subtrees

原题链接:https://leetcode.com/problems/find-duplicate-subtrees/ 1. 题目介绍 Given a binary tree, return all duplicate subtrees. For each kind of duplicate subtrees, you only need to return the root node of an...

Ber03的博客 368

java found dulicate_LeetCode 652: 寻找重复的子树Find Duplicate Subtrees

LeetCode 652: 寻找重复的子树 Find Duplicate Subtrees题目:给定一棵二叉树,返回所有重复的子树。对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。两棵树重复是指它们具有相同的结构以及相同的结点值。Given a binary tree, return all duplicate subtrees. For each kind of duplica...

weixin_36024234的博客 172

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

题目: 给定一棵二叉树,返回所有重复的子树。对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。两棵树重复是指它们具有相同的结构以及相同的结点值。Given a ...

爱写Bug 177

[Swift]LeetCode652. 寻找重复的子树 | Find Duplicate Subtrees

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)➤GitHub地址:https://github.com/strengthen/LeetCode➤原文地址:https://www.cnblogs.com/streng...

weixin_30363817的博客 139

[LeetCode 652] Find Duplicate Subtrees

Given a binary tree, return all duplicate subtrees. For each kind of duplicate subtrees, you only need to return the root node of anyoneof them. Two trees are duplicate if they have the same struct...

ExcitedZhang的博客 213

[leetcode] 652. Find Duplicate Subtrees

Description Given a binary tree, return all duplicate subtrees. For each kind of duplicate subtrees, you only need to return the root node of any one of them. Two trees are duplicate if they have the ...

Learning from the mistakes 278

[Leetcode] 652. Find Duplicate Subtrees 解题报告

题目: Given a binary tree, return all duplicate subtrees. For each kind of duplicate subtrees, you only need to return the root node of any oneof them. Two trees are duplicate if they have the s

魔豆(Magicbean)的博客 606

Leetcode 652 Find Duplicate Subtrees

Problem: Given a binary tree, return all duplicate subtrees. For each kind of duplicate subtrees, you only need to return the root node of any one of them. Two trees are duplicate if they have the sam...

Opium_Z的博客 193
上一篇: leetcode 637. Average of Levels in Binary Tree(二叉树每层的平均数)
下一篇: leetcode 653. Two Sum IV - Input is a BST(两个数之和,输入是BST)
蓝羽飞鸟
博客等级 码龄8年 1万+粉丝 727原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值