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

这篇具有很好参考价值的文章主要介绍了二叉树与树、森林之间的转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

 关于树的概念

树可以称为特殊的森林 , 其中二叉树是树中一些节点度数最大为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)将图形规整化,使各节点按层次排列。

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

 


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

其实在这样的转换过程里面,是把原先的保留左孩子的关系仍然保留,而原有的兄弟是他的右子树上的节点,现在我们要二叉树转换回来,就要把原有的右子树上的链条去掉,再次把右子树上的节点,恢复成兄弟关系,然后兄弟指向双亲即可。文章来源地址https://www.toymoban.com/news/detail-496736.html

到了这里,关于二叉树与树、森林之间的转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 树、森林与二叉树的相互转换

     二叉树和树都可以用二叉链表作为存储结构,因此二叉链表可以导出树与二叉树的一个对应关系,即 给定一棵树,可以找到唯一的一棵二叉树与之对应 。其中树的二叉链表存储详情可参照树的存储结构及详细完整代码。 树转换成二叉树的规则: 1每个结点的左指针指向它

    2024年02月09日
    浏览(29)
  • 【数据结构】树与二叉树(一):树(森林)的基本概念:父亲、儿子、兄弟、后裔、祖先、度、叶子结点、分支结点、结点的层数、路径、路径长度、结点的深度、树的深度

    树 一棵树是结点的有限集合T: 若T非空,则: 有一个特别标出的结点,称作该树的 根 ,记为root(T); 其余结点分成若干个不相交的非空集合T1, T2, …, Tm (m0),其中T1, T2, …, Tm又都是树,称作root(T)的 子树 。 T 空时为空树,记作root(T)=NULL。 有序树、无序树   如果子树T1, T

    2024年02月05日
    浏览(55)
  • 《数据结构C语言版》——树、森林与二叉树的转换(超详图解)

    哈喽!这里是一只派大鑫,不是派大星。本着基础不牢,地动山摇的学习态度,从基础的C语言语法讲到算法再到更高级的语法及框架的学习。更好地让同样热爱编程(或是应付期末考试 狗头.jpg)的大家能够在学习阶段找到好的方法、路线,让天下没有难学的程序(只有秃头的程

    2024年02月10日
    浏览(39)
  • 数据结构--树4.2.4(树、森林即二叉树的相互转换(仅供参考))

    目录 一、树转换成二叉树步骤 二、森林转换成二叉树  三、二叉树到树、森林的转换 分两个步骤:         1、在树中所有的兄弟结点之间加一连线。         2、对每个结点,除了保留与其长子(最左边)的连线外,去掉该结点与其他孩子的连线。         1、先将森林中

    2024年02月11日
    浏览(33)
  • 数据结构:图文详解 树与二叉树(树与二叉树的概念和性质,存储,遍历)

    目录 一.树的概念 二.树中重要的概念 三.二叉树的概念 满二叉树 完全二叉树 四.二叉树的性质 五.二叉树的存储 六.二叉树的遍历 前序遍历 中序遍历  后序遍历  树是一种 非线性数据结构 ,它由节点和边组成。树的每个节点可以有零个或多个子节点,其中一个节点被指定为

    2024年02月04日
    浏览(49)
  • 二叉树的概念|满二叉树与完全二叉树|二叉树的性质|二叉树的存储结构

    在数据结构中树的用途其实并不大,用得更多的其实是二叉树。所以在本章我们将详细讲解二叉树。 一颗二叉树是结点的一个 有限集合 ,该集合: 或者为空 或者由一个根节点加上两颗(互不相交)别称为左子树和右子树的二叉树组成 如图我们可知, 二叉树的特点: 二叉

    2024年01月21日
    浏览(44)
  • 树与二叉树

    树是一种非线性的数据结构,它是由n(n=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 有一个特殊的结点,称为根结点,根节点没有前驱结点 除根节点外,其余结点被分成M(M0)个互不相交的集

    2024年02月20日
    浏览(38)
  • 二叉树与堆

    目录 一、二叉树 1、二叉树的概念及结构 1.1、树的概念 1.2、二叉树的概念 1.3、二叉树的存储结构 1.3.1、顺序结构存储 1.3.2、链式结构存储 2、二叉树的实现(链式结构) 2.1、二叉树的遍历 2.1.1、前序、中序以及后序遍历 2.1.2、层序遍历 2.2、二叉树链式结构的代码实现 二、

    2024年02月10日
    浏览(34)
  • 数据结构--树与二叉树

    树的定义 树是n(n =0)个节点的有限集。当n=0 时,称为空树 在任意一棵非空树中应满足 有且仅有一个特定的称为根的结点 当n1 时,其余节点可分为m(m0) 个互不相交的有限集T1,T2……Tm,其中每个集合本身又是一棵树,并且称为根的子树 树是一种逻辑结构,也是一种分层结构 树的

    2024年02月22日
    浏览(45)
  • [数据结构] 树与二叉树

    树是由 (n(n geq 0)) 个节点组成的有限集。当 (n = 0) 时,称为空树。 任意一棵非空树应满足以下两点: (1)有且仅有一个特定的称为根的节点; (2)当 (n 1) 时,其余节点可分为 (m(m0)) 个互不相交的有限集 (T_1, T_2, dots, T_m) ,其中每个集合本身又是一棵树,称为根的

    2024年03月09日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包