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

    1、树转二叉树

    1.加线:在所有兄弟结点之间加一条连线
    2.去线:对树中每个结点,只保留它与第一个孩子结点的连线,删除它与其它孩子结点之间的连线
    3.层次调整:以树的根节点为轴心,将整棵树顺时针旋转一定角度,使之结构层次分明。
      注意:第一个孩子是二叉树结点的左孩子,兄弟转换过来的孩子是结点的右孩子

    2、二叉树转换为树

      二叉树转换为树是树转换为二叉树的逆过程,也就是反过来做而已。

    1.加线。若某结点的左孩子存在,则将这个左孩子的右孩子结点、右孩子的右孩子结点、右孩子的右孩子结点的右孩子结点……,反正就是左孩子的n个右孩子结点都作为此结点的孩子。将该结点与这些右孩子结点用线连接起来。

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

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

    3.森林转二叉树

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

    1.把每个树转换为二叉树。

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

    4.二叉树转换为森林

      判断一颗二叉树能够转换成一颗树还是森林,标准很简单,那就是只要看这颗二叉树的根结点有没有右孩子,有就是森林,没有就是一颗树。那么如果是转换成森林,步骤如下:

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

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

     

     

    5.树与森林的遍历

    森林的遍历分为两种:

    1.前序遍历:先访问森林中第一棵树的根结点,然后再依次先根遍历根的每颗子树,再依次用同样的方式遍历除去第一颗树的剩余树构成的森林。如上图右侧三颗树的森林,前序遍历序列的结果就是  ABCDEFGHJI

    2.后序遍历:是先访问森林中第一颗树,后根遍历的方式遍历每颗子树,然后再访问根结点,再依次同样方式遍历除去第一颗树的剩余树构成的森林。如上图右侧三颗树的森林,后序遍历序列的结果就是 BCDAFEJHIG

    森林的前序遍历和二叉树的前序遍历结果相同,森林的后序遍历和二叉树的中序遍历结果相同

  • 相关阅读:
    BZOJ 2212/BZOJ 3702
    BZOJ 4761 Cow Navigation
    BZOJ 3209 花神的数论题
    BZOJ 4760 Hoof, Paper, Scissors
    BZOJ 3620 似乎在梦中见过的样子
    BZOJ 3940 Censoring
    BZOJ 3942 Censoring
    BZOJ 3571 画框
    BZOJ 1937 最小生成树
    BZOJ 1058 报表统计
  • 原文地址:https://www.cnblogs.com/Yang-Xin-Yi/p/14762684.html
Copyright © 2011-2022 走看看