数据结构-第6章 树和二叉树---4. 树和森林(V1)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
⑵ 去连线。去掉原二叉树中所有父结点与其 右孩子之间的连线,如图(b)所示。 ⑶ 规整化。将图中各结点按层次排列且将所 有的虚线变成实线,整理得到树或者森林,如 图(c)所示。
6.4.2 树、森林和二叉树的转换
R A DB EC
G F
(a) 加虚线后
R A DB EC
G F
(b) 去连线后
R AB C D EG F
B C
D
A E
L HK
M
技巧:无左孩子 者即为叶子结点
6.4.3 树和森林的遍历
1. 树的遍历 由树结构的定义可知,树的遍历有二种方法。 ⑴ 先序遍历:先访问根结点,然后依次先序 遍历完每棵子树等。价于对应二叉树的先序遍历
⑵ 后序遍历:先依次后序遍历完每棵子树,然 后访问根结点。等价于对应二叉树的中序遍历
6.4.3 树和森林的遍历
先序遍历的次序是:ABCDEFGIJHK 后序遍历的次序是:CDBFIJGHEKA
A
B
E
K
C DF GH
IJ
6.4.3 树和森林的遍历
1. 森林的遍历 ⑴ 先序遍历:按先序遍历树的方式依次遍历F 中的每棵树。等价于树的先序遍历 (2) 中序遍历:按中序遍历树的方式依次遍历F 中的每棵树。等价于树的后序遍历
根结点的右子树,依次类推,则第一棵树的根结
点就是转换后生成的二叉树的根结点。
A
A
G
A
G
B
L
B
G
B C L KM
CH K
C
L
DH
D
MD
(b) 森林中每棵树
HK M
(a) 森林
对应的二叉树
(c) 森林对应的二叉树
6.4.2 树、森林和二叉树的转换
3. 二叉树转换为树或森林 其步骤是:
⑴ 加虚线。若某结点是其父结点的左孩子, 则将该结点的右孩子、右孩子的右孩子、..., 都与该结点的父结点加虚线相连,如图(a)所示 。
typedef struct PTNode #define N 6 /* 结点数 */
{ ElemType data ;
PTNode Nodes[N] ;
struct PTNode *next ;
}PTNode ;
6.4.1 树的存储结构
1
01
2
3
12
23
45
63 4
45
56
2
3∧
4
5∧
6∧


∧ຫໍສະໝຸດ Baidu
6.4.2 树、森林和二叉树的转换
R AB C D EG F
(a) 一般的树
R AB C DEG F (b) 加虚线,去连线后
R A DB EC
G
F
(C) 转换后的二叉树
6.4.2 树、森林和二叉树的转换
2. 森林转化为二叉树
将F={T1, T2,⋯,Tn} 中的每棵树转换成二叉树。 按森林中树的次序,后一棵树作为前一棵树的
0 R -1 1A 0 2B 0 3C 0
}Ptree ; R
4D 1 5E 1
AB C
6F 3
7G 6
DE
F
8H 6
9I 6
G H I 10~MAX_Size-1 ... ...
6.4.1 树的存储结构
2. 孩子表示法
每个结点的孩子结点构成一个单链表,即有n 个结点就有n个孩子链表;
n个孩子的数据和n个孩子链表的头指针组成一 个顺序表; 结点结构定义: 顺序表定义:
6.4 树和森林
1、树的存储结构:孩子兄弟表示法(二 叉链表表示法)---掌握 2、树、森林和二叉树之间的转换:把树 的孩子兄弟表示法解释为二叉树的二叉 链表表示法。---掌握 3、树和森林的遍历。---理解
作业
已知一棵二叉树的先序遍历序列和中序遍历序 列分别为ABDEFCGH和DEBFAGCH, (1)请画出这棵二叉树; (2)给出该树的后序遍历序列; (3)画出这棵二叉树对应的中序线索树。 (4)将这棵二叉树转换为对应的森林
6.1 树的基本概念 6.2 二叉树 6.3 遍历二叉树和线索二叉树 6.4 树和森林 6.5 哈夫曼树及其应用
6.4.1 树
树和二叉树的区别: (1)二叉树至多有两个子树,树则不然; (2)二叉树的子树有左右之分,而树的子树没 有次序; (3)二叉树允许树为空,树一般不允许为空( 个别教材允许为空)
typedef struct PTNode { ElemType data ;
int parent ;
}PTNode ;
6.4.1 树的存储结构
1. 双亲表示法
#define MAX_SIZE 100
typedef struct { PTNode Nodes[MAX_SIZE] ;
int num ; /* 结点数 */
(C) 还原后的树
6.4.2 树、森林和二叉树的转换

R
AB C
DE
存储
对应关系
R A ⋀D ⋀
二叉树 R
A
DB
存储
EC
R⋀ A ⋀D ⋀
解释
B ⋀C⋀ ⋀E⋀
B ⋀E⋀ ⋀C ⋀
解释
R⋀
A
⋀D⋀ B ⋀E⋀ ⋀C⋀
练习
如图所示的二叉树BT是由森林T1转换而来的 二叉树,那么森林T1中有(5)叶子结点。
ElemType data ; struct CSnode *firstchild, *nextsibing ; }CSNode;
6.4.1 树的存储结构
R AB C D EG F
R⋀
A
⋀D
⋀B
⋀E ⋀
C⋀
⋀G
⋀F ⋀
6.4.2 树、森林和二叉树的转换
1. 树转换为二叉树 将树转换成二叉树在“孩子兄弟表示法”中已 给出,其详细步骤是: ⑴ 加线。在树的所有相邻兄弟结点之间加一 条连线。 ⑵ 去连线。除最左的第一个子结点外,父结点 与所有其它子结点的连线都去掉。 ⑶ 旋转。将树以根结点为轴心,顺时针旋转 450,使之层次分明。
6.4.1 树的存储结构
3. 孩子兄弟表示法(二叉树表示法) 以二叉链表作为树的存储结构。 链表中每个结点有两个链域,分别指向第一个 孩子结点和下一个兄弟(右兄弟)结点。
firstchild data nextsibing
第一个孩子结点 下一个兄弟结点
6.4.1 树的存储结构
typedef struct CSnode {
6.4.1 树的存储结构
1. 双亲表示法 2. 孩子表示法 3. 孩子兄弟表示法
最常用
6.4.1 树的存储结构
1. 双亲表示法
用一组连续的存储空间来存储树的结点,同时 在每个结点中附加一个指示器(整数域) ,用以 指示双亲结点的位置(下标值) 。
结点的结构表示: 树的结点结构定义:
Data Parent
相关文档
最新文档