二叉树与树、森林之间的转换

news2025/7/9 9:02:31

 关于树的概念

树可以称为特殊的森林 , 其中二叉树是树中一些节点度数最大为2 ,并且分左右孩子的树

● 二叉树很重要

        • 结构简单

        • 存储效率高

        • 运算算法相对简单

        • 任何森林、树都可以转换成二叉树

● 讨论

        • 二叉树 == 度为2 的树 ?

答: 树的度就是树节点数, 最大的度数 , 一般的树的两个孩子节点 ,是不区分左右孩子 的 , 而二叉树是区分左右孩子的  , 所以如果一个树区分左右孩子 , 那就是二叉树 

如果一个树, 虽然度数最大为 2 , 但是不区分左右孩子就不是二叉树.

森林、树转换成二叉树

 我们先思考 , 为什么要把森林转换成二叉树 , 二叉树有什么好处 , 再思考如何转换?


因为二叉树具有它独特的特点和重要的性质。转化为二叉树可以使复杂的问题简单化。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个结点最多只能有两棵子树,且有左右之分。森林转化为二叉树,更多的是为了对森林中的节点做遍历操作


知乎回答:

我的理解是普通的树状结构自带的特点太少,而二叉树有很多其自身特点比如满二叉树每层的节点个数是确定,总节点个数个数确定了,其边的个数也就确定了,还有很多已经研究明白的性质,在具体的实际问题中抽象出来的树状结构可能并不是二叉树,如果针对么个树状结构提供一套解决方案那么树状结构不同,代码会有差异,而此时,如果把通用的树状结构转换为二叉树,就可以使用已经研究明白的二叉树的性质解决问题了。

二叉树类似一个规整的数据结构,而实际问题中抽象出来的数据结构可以转换为这个规整的数据结构,通过二叉树解决问题的途径和方法更丰富,所以会把树、森林转换为二叉树。



作者:凌夜知惜
链接:https://www.zhihu.com/question/288101803/answer/2584131494
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

转换方法:

(1)在所有相邻兄弟节点(森林中每棵树的根节点可看成兄弟节点)之间加一水平连线。


(2)兄弟们只留一个老大, 其余兄弟和双亲断开联系 ,靠老大和双亲联系,从多接口变成单接口

对每个非叶节点 k ,除了其最左边的孩子节点外,删去 k 与其他孩子节点的连线

(最左孩子仍作为左孩子)

(3)为了层次设计 , 左孩子仍为左孩子  , 右边的兄弟旋转变成左边兄弟的右孩子

所有水平线段以左边节点为轴心顺时针旋转45度(兄弟作为右孩子)

我们依次旋转 , 第一个树,我们以 B 为旋钮 , 然后 c 成为 B 的右孩子,D成为 c的右孩子

第二棵树 , 根节点 E 是 A的兄弟 , 成为 A 的右孩子 ,E的唯一一个孩子成为左孩子

第三棵树 , 根节点 G 是 E 的兄弟 , 成为 E 的右孩子 , G的左孩子H 依然是G的左孩子

I 作为 H 的兄弟 , 成为 H 的右孩子


总结: 

        在任何一棵树里面,把最左的孩子仍然作为左孩子 去使用,而把它所有的兄弟作为右孩子,通过这样的转换 , 我们把森林转换成了二叉树。

二叉树还原为森林、树

我们怎样将二叉树 , 转换为森林或树呢?我们怎么把森林转换成二叉树的 , 就怎么转换回去即可

我们知道 , 森林转换成二叉树 , 二叉树所有节点的右孩子,转换前,是其此节点的兄弟 , 左孩子仍为其左孩子 ,

所以我们只需要将左孩子仍然保留 , 右孩子转换成其双亲的兄弟,变成兄弟后,再指向老大的双亲即可, 没有双亲就分散成森林即可。


下面我们开始实操:

(1)对于一棵二叉树中任一节点K1,沿着k₁的右子树方向搜索所有右孩子节点,得节点序列

k₂,k₃,.....,kₘ,其中k ᵢ₊₁ 为k ᵢ的右孩子节点(1<= i < m), kₘ 没有右孩子节点。


 

(2)删去k₁ , k₂,。。。,kₘ 之间连线。找到变成兄弟的右孩子的节点 ,断开束缚)

 


(3)若 k₁ 有双亲节点 k , 则连接 k 与 k  ᵢ (2<= i <= m)   (兄弟根据老大找妈妈,没有则独立)


 

(4)将图形规整化,使各节点按层次排列。

 


 这样我们就实现了二叉树转换成森林、树的方法  

其实在这样的转换过程里面,是把原先的保留左孩子的关系仍然保留,而原有的兄弟是他的右子树上的节点,现在我们要二叉树转换回来,就要把原有的右子树上的链条去掉,再次把右子树上的节点,恢复成兄弟关系,然后兄弟指向双亲即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/6848.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

官方盘点 .NET 7 新功能

.NET 7 为C# 11/F# 7、.NET MAUI、ASP.NET Core/Blazor、Web API、WinForms、WPF 等应用程序带来了更高的性能和新功能。使用 .NET 7&#xff0c;您还可以轻松地将 .NET 7 项目容器化&#xff0c;在 GitHub 操作中设置 CI/CD 工作流&#xff0c;并实现云原生可观察性。欢迎下载…

java之Fork/Join框架

文章目录前言工作窃取算法Fork/Join框架的设计Fork/Join框架的异常处理Fork/Join框架的实现原理总结前言 Fork/Join框架是java7提供的一个用于执行并行任务的框架&#xff0c;是一个把大部分任务分割成若干个小任务&#xff0c;最终汇总每个小任务结果后&#xff0c;得到大任务…

4进程地址空间

文章目录前言1. 概念引入2. CPU和物理内存关系3.何为进程地址空间4. 为什么存在地址空间?前言 本节主要是讲解进程地址空间,区分和物理内存地址空间的差别,并且向读者解释四个疑问: 怎样验证地址空间的排布; 进程地址空间是什么; 进程地址空间和物理内存之间的关系; 为什么要…

[附源码]java毕业设计基于web的球类体育馆预定系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

数据链路层(2层 Data Link Layer)

1、数据链路层属于2层 2、传输单元&#xff1a;帧 帧格式&#xff1a; 802.3 有线网卡 802.11 无线网卡&#xff0c;无线路由器都支持802.11 802开头的都是国际标准&#xff0c;是由IEEE国际学术组织制定的标准 3、帧结构的构成&#xff1a;MAC子层&#xff08;帧头&…

MySQL表的增删改查(进阶)

目录1.数据库约束1.1约束类型1.2 NULL约束1.3 UNIQUE&#xff1a;唯一约束1.4 PRIMARY KEY: 主键约束1.5 DEFAULT&#xff1a;默认值约束1.6 FOREIGN KEY&#xff1a;外键约束2. 表的设计3. 新增4. 查询4.1 聚合查询4.1.2 GROUP BY子句4.2 联合查询4.2.1内连接4.2.2外连接4.2.3…

2022 第十四届蓝桥杯模拟赛第一期(题解与标程)

第十四届蓝桥杯模拟赛第一期1. 二进制位数问题描述答案提交参考答案2. 晨跑问题描述答案提交参考答案3. 调和级数问题描述答案提交参考答案程序验证4. 山谷问题描述答案提交参考答案5. 最小矩阵问题描述答案提交参考答案6. 核酸日期问题描述输入格式输出格式样例输入样例输出评…

项目风险管理的5大关键点,你做了几点?

1、全方位科学分析项目风险 为了提高项目抗风险能力&#xff0c;我们需要对项目风险进行科学全面的分析。一般我们从3个维度对风险进行科学分析&#xff1a;影响的严重性、发生的可能性、产生的影响性。 根据风险或机会对项目的影响程度&#xff0c;一般我们会从三个维度将其划…

javascript大作业《web课程设计》用html做一个期末作业网站,梅西足球体育网页,css

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

STING 与 cGAS的结合导致TBK1 激酶募集和活化

来自细菌或病毒的核酸在受感染的细胞中会产生强效的免疫反应&#xff0c;而病原体衍生核酸的检测是宿主感知感染并启动保护性免疫反应的核心策略。cGAS (Cyclic GMP-AMP synthase) 是一种双链 DNA 传感器&#xff0c;可催化 cGAMP&#xff08;cyclic GMP-AMP&#xff09;的合成…

二级导航栏

简介&#xff1a;本文通过HTML与CSS相集合的方式&#xff0c;来实现二级导航菜单。 HTML构建骨架 <body><ul class"nav1"><li>水果<ul class"nav2"><li>苹果</li><li>香梨</li><li>火龙果</li…

前端CSS射门动画-为梅西最后一届世界杯加油

☆ 距离2022卡塔尔世界杯只有6天时间了&#xff0c;众多球星我喜欢梅西和奥乔亚。 ☆ 我们不能到现场去&#xff0c;只能手中的代码自娱自乐一下&#xff0c;就当为梅西加油了。这是梅西最后一届世界杯了。 梅西给我的感觉&#xff0c;踢球足够利落干净&#xff0c;你不会从他的…

AI遮天传 ML/DL-感知机

感知机的出现是人工智能发展史一大重要里程碑&#xff0c;其后才诞生了&#xff1a;多层感知机、卷积神经网络等一系列的经典网络模型。 在我看来&#xff0c;它虽然是深度学习领域的一大开端&#xff0c;但本身解决的只是线性二分类问题&#xff0c;它本身与机器学习经典模型线…

RORγ 反向激动剂-XY101 小分子化合物

早在 2016 年&#xff0c;中国科学院广州生物医药与健康研究院许永教授团队就曾与加州大学戴维斯分校的陈宏武教授合作&#xff0c;首次发现核激素受体 RORγ 是作用于雄激素受体 AR 上游的关键驱动因子&#xff0c;直接调控雄激素受体 AR 的表达。因此&#xff0c;RORγ 成为前…

gitlab+jenkins+harbor次完整CI链条

用一台机器搭harbor 先安装docker工具&#xff0c;因为装harbor需要docker [rootharbor ~]# cd /etc/yum.repos.d [rootharbor yum.repos.d]# wget https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo [rootharbor yum.repos.d]# sed -i s#download.docke…

HTML做一个个人博客页面(纯html代码)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

【网页设计】期末大作业html+css (个人生活记录介绍网站)

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

CNC程序管理NC文件版本管理CNC程序生命周期管理NC程序版本管理

CNC程序管理NC文件版本管理CNC程序生命周期管理NC程序版本管理 ROZRZ 数控程序文档流程管理系统能够实现 NC 数控程序文档及流程的管理&#xff0c;且为企业日后能够进行整体生产资料信息的综合管理做好了在程序代码方面的数据准备&#xff0c;提供了更为方便、快捷、安全的系…

Java——后端开发经验总结(持续更新中)

目录 一、判断实体类 二、图片无法正常显示 三、图片路径存储问题 四、xml注释 五、常用快捷键使用 每日三问 重要配置 一、判断实体类 Assert.notNull&#xff1a; 断言某个值是否为空 优点&#xff1a;告别了if判断为空。缺点&#xff1a;场景比较单一&#xff0c;基本…

【JavaSE】继承那些事儿

目录 1. 继承 1.1 为什么要有继承 1.2 何为继承 1.3 继承的语法 1.4 父类成员的访问 1.4.1 子类中访问父类的成员变量 1.4.2 子类中访问父类的成员方法 1.5 super 关键字 1.5.1 super 关键字能让子类访问父类同名成员变量及方法 1.5.2 super 关键字在子类构造方法所起的作用 1…