树与二叉树的相互转换以及森林和二叉树的相互转换

Posted nufe_wwt

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树与二叉树的相互转换以及森林和二叉树的相互转换相关的知识,希望对你有一定的参考价值。

树与二叉树的相互转换以及森林和二叉树的相互转换

一、孩子兄弟表示法

在介绍这两种转换前我想先说一下:树的存储结构—孩子兄弟表示法
二叉树 (二叉链表)表示法: 链表中结点的两个链域分别指向该结点的第一个孩子和下一个兄弟。结点结构:

firstchilddatanextsibling

树的二叉链表存储(孩子兄弟表示法)结构体表示:

typedef struct CSNode

     ElemType data;
     struct CSNode *firstchild, *nextsibling;    
CSNode,*CSTree;


孩子兄弟表示法的优点易于找结点孩子缺点不易查找结点的双亲,破坏了树的层次


二、树与二叉树的相互转换(1)



1.树T转换成二叉树B(1)

通过孩子兄弟表示法我们可以知道根节点A只有孩子,没有兄弟,所以该二叉树只有左子树和根节点,其实每一个数转化成二叉树后都是没有右子树的。
已知T要求B
第一步:确定在B中A的左结点链接B,因为C、D都是B的兄弟,所以B的右节点是C,C的右节点是D
第二步:同第一步,可以确定以B为“根”的子树,以及以D为“根”的子树。
这个讲法应该很好理解吧

2.二叉树B转换成树T(1)

已知B要求T
第一步:确定根节点A的孩子,因为A的左结点是B,而B有右节点C,C有右节点D,D无右节点,所以可以确定在T中 A的孩子有BCD
第二步:同第一步,可以确定B的孩子以及其孩子的兄弟、D的孩子以及其孩子的兄弟。


三、森林和二叉树的相互转换(1)



1.森林F转换成二叉树B(1)

已知F求B
第一步:将森林F中的第一棵树的根节点作为二叉树B的根节点,其子树按照树转化成二叉树的方法转化为B的左节点
第二步:将其他剩余的树的根节点依次作为二叉树B的根节点的兄弟结点,然后将其依照树转化为二叉树的方法转化为B的右节点

2.二叉树B转换成森林F(1)

已知B求F
第一步:确定二叉树B的左子树,按照二叉树转化为树的方法将左子树+根节点转化为森林的第一棵树
第二步:通过二叉树B的根的右节点的右节点的右节点...的右节点确定有多少棵树,在依次将他们转化成一棵棵的树。

四、树与二叉树的相互转换(2)

方法2 就是书本上的方法啦,感觉也不是很好用,看看就好

1.树T转换成二叉树B(2)

步骤1:加线-在兄弟之间加一连线;
步骤2:抹线-对每个结点,除了其左孩子外,去除其与其余孩子之间的关系;
步骤3:旋转-以树的根结点为轴心,将整树顺时针转45°。


2.二叉树B转换成树T(2)

步骤1:加线-若p结点是双亲结点的左孩子,将p的右孩子,沿分支找到的所有右孩子,与p的双亲连线;
步骤2:抹线-抹掉原二叉树中双亲与右孩子之间的连线;
步骤3:将结点按层次排列,形成树结构。


五、森林和二叉树的相互转换(2)

1.森林F转换成二叉树B(2)

步骤1:转换-将各棵树分别转换成二叉树;
步骤2:加线-将每棵树的根结点用线相连;
步骤3:旋转-以第一棵树根结点为二叉树的根,再以根结点为轴心,顺时针旋转,构成二叉树。


2.二叉树B转换成森林F(2)

步骤1:抹线-将二叉树根结点与其右孩子连线、沿右分支搜索到的所有右孩子间连线全部抹掉,使之变成多棵二叉树;
步骤2:还原-将孤立的二叉树还原成树;


3.森林和二叉树的转换-规则

设森林F=T1,T2,……Tm,二叉树B=(root,LB,RB)
(1) 森林转化成二叉树的规则
1.若F为空(m = 0),B为空;
2.若F不空(m≠0),B的根root(B)是F中第一棵树T1的根root (T1)
左子树LB从T1根结点的子树森林(T11, T12, …, T1m)转换来;
右子树RB是从森林F’=T2, T3, …, Tm 转换而来。
(2) 二叉树转换为森林的规则
1.若B为空, F为空;
2.若B非空,则F中第一棵树T1的根为二叉树的根root(B);
T1根的子树森林F1由B的左子树LB转换而来;
F 中除 T1 外其余树组成的森林F’= T2, T3, …, Tn 由B 的右子树 RB 转换而来。


六、树和森林的遍历

1.树的遍历

先根遍历:若树不空,先访问根结点,再依次先根遍历各棵子树
后根遍历:若树不空,先依次后根遍历各棵子树,再访问根结点


2.森林的遍历

先序遍历(对森林中每一棵树进行先根遍历
·访问第一棵树的
·先根遍历第一棵树中根结点的子树森林。
·先根遍历除去第一棵树之后剩余的树构成的森林。
中序遍历(对森林中每一棵树进行后根遍历
·后根遍历第一棵树中根结点的子树森林。
·访问第一棵树的根。
·后根遍历除去第一棵树之后剩余的树构成的森林。
(为什么叫基于后根遍历要叫中序遍历呢?因为第二部访问了第一棵树的根结点,也就是对应的二叉树的根节点,所以是中序。)

以上是关于树与二叉树的相互转换以及森林和二叉树的相互转换的主要内容,如果未能解决你的问题,请参考以下文章

森林树与二叉树相互转换

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

[数据结构]树森林与二叉树之间的相互转换方法

[数据结构]树森林与二叉树之间的相互转换方法

树的存储结构;树与二叉树的转换;树和森林的遍历算法

信息学赛培 | 02 树与二叉树必备基本理论(最全)