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


     关于树的概念

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

     


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

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

  • 相关阅读:
    最详细STM32,cubeMX 定时器
    【Spring Cloud】深入理解 Eureka 注册中心的原理、服务的注册与发现
    Go 服务自动收集线上问题现场
    一步步实现知乎热榜采集:Scala与Sttp库的应用
    同样是免费的SSL证书,有什么不一样的吗?
    Python读取文件
    先行进位加法器
    mybatis-plus 多数据源配置
    信息安全-大数据安全需求分析与安全保护工程
    初识C++
  • 原文地址:https://blog.csdn.net/qq_57484399/article/details/127843670