zoukankan      html  css  js  c++  java
  • 转:树、森林与二叉树的转换

      在讲树的存储结构时,我们提到了树的孩子兄弟法可以将一棵树用二叉链表进行存储,所以借助二叉链表,树和二叉树可以相互进行转换。从物理结构来看,它们的二叉链表也是相同的,只是解释不太一样而已。因此,只要我们设定一定的规则,用二叉树来表示树,甚至表示森林都是可以的,森林与二叉树也可以互相进行转换。

      我们分别来看看它们之间的转换如何进行。

    1.1 树转换为二叉树

      将树转换为二叉树的步骤如下:

      1.加线。在所有兄弟结点之间加一条连线

      2.去线。对树中每个结点,只保留原树中它与第一个孩子结点的连线,删除它与其他孩子结点之间的连线。

      3.层次调整。以树的根结点为轴心,将整棵树顺时针旋转一定的角度,使之结构层次分明。注意第一个孩子是二叉树结点的左孩子,兄弟转换过来的孩子是结点的右孩子。

       

    1.2 森林转换为二叉树

      森林是由若干棵树组成的,所以完全可以理解为,森林中的每一棵树都是兄弟,可以按照兄弟的处理方法来操作。步骤如下:

      1.把森林中的每一棵树转换为二叉树。

      2.第一棵树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树的根结点的右孩子,用线连接起来。当所有的二叉树连接起来后就得到了由森林换来的二叉树。

      

    1.3将二叉树转换为树

      二叉树转换为树是树转换为二叉树的逆过程,也就是反过来做而已。如图6-11-4所示。步骤如下:

      1.加线。若某结点的左孩子结点存在,则将这个左孩子的右孩子结点、右孩子的右孩子结点、....等,这些右孩子结点与该结点相连。

      2.去线。删除原二叉树中所有结点与其右孩子结点的连线。

      3.层次调整。使之结构分明。

    1.4 二叉树转换为森林

      有右孩子的二叉树才可以转换成森林。步骤如下:

      1.从根结点开始,若右孩子存在,则把与右孩子结点的连线删除,再查看分离后的二叉树,若右孩子存在,则连线删除...,直到所有右孩子连线都删除为止,得到分离的二叉树。

      2.再将每棵分离后的二叉树转换为树即可。

    1.5 树与森林的遍历问题

      

      树先序遍历:

        树(先序):A-B-E-F-G-C-H-D-I-J

        对应二叉树(先序):A-B-E-F-G-C-H-D-I-J

      树后序遍历:

        树(后序):E-F-G-B-H-C-I-J-D-A

        对应二叉树(中序):E-F-G-B-H-C-I-J-D-A(与树的后序遍历相一致)

       

      

        森林先序遍历:

          森林(先序):A-B-C-D-E-F-G-H-J-I 

          对应二叉树(先序):A-B-C-D-E-F-G-H-J-I (相同)

        森林后序遍历:

          森林后序(后序):B-C-D-A-F-E-J-H-I-G

          对应二叉树(中序):B-C-D-A-F-E-J-H-I-G(与森林的后根遍历相同)

      

  • 相关阅读:
    离散数学知识点总结(8)-图论
    离散数学知识点总结(7)-格
    离散数学知识点总结(6)-计数技术
    离散数学知识点总结(5)函数
    离散数学知识点总结(4)-集合
    离散数学知识点总结(3)-二元关系
    离散数学知识点总结(2)-谓词逻辑
    离散数学知识点总结(1)-命题逻辑
    镜像仓库和Harbor
    视频管理上云平台EasyNVS 2.1版本分享RTSP流和RTMP流端口发生变化是什么原因?
  • 原文地址:https://www.cnblogs.com/yichengming/p/11389616.html
Copyright © 2011-2022 走看看