当前位置:文档之家› 数据结构——树与森林

数据结构——树与森林

9
§6.2 树的存储结构
6.2.1 父结点表示法存储
将树中结点按照“由上到下”和“由左到右”的顺序做成一 个结点序列,将该序列存放在一维数组Tr当中。Tr中每个元素 (结点)都有一个Data域和一个Parent域,其中Data域存放结 点数据,而Parent域存放结点的父结点在数组中下标。
A
Tr[i]:
1 2 3 4 5 6 7 8 9 10
A B ^
^ C D ^
^
E
^
F
^
G
^
H
^
^
J
^
K
^
15
§6.3 树的遍历
6.3.1 层次遍历
1、层次遍历概念
两个步骤:
① 按照树的“层”的顺序进行访问,即“从上到下”。 ② 访问到达每一层后,再依次访问该层的每个结点,即“从左到右”。
两个基本点:
① 采用子结点表示法的存储结构记录树中结点。 ② 基于队列的结点存储 当进入一个结点后,需要将该结点所有子结点
第六章 树与森林
学习要点:

树的递归定义和森林的基本概念。
树与森林的存储结构。
树与森林的遍历算法 树、森林与二叉树的相互转换。
2
§6.1 树及其相关概念
6.1.1 树的基本概念
1、树的基本概念
树(Tree)是一个由n(n≥0)个结点构成的有限集合T。 ① 当n=0时,称T为“空树”。 ② 当n≠0时,T中诸元素满足下述条件: ● 有且仅有一个特定数据元素没有前驱,称其为T的根结点。 ● 除根结点外其余数据元素,又可分为m(0≤m<n)个互不相交 的有限集合:T1,T2,…,Tm,每一个集合Ti(0≤i≤m)又是一
可以分别按照顺序或链表方式进行进行存储。
下标 0 Data A B C D E F G H I J K Lch 1 4 -1 6 -1 -1 8 -1 -1 -1 -1 (b) RS -1 2 3 -1 5 -1 7 -1 9 10 -1
^ I
(c) Data LCH RS
A B E F I C G J K D H
路径的长度
7
6.1.2 结点及其基本概念2
2、结点分类
(1)根结点:树T中没有前驱的结点称为T的根结点
叶结点:树T中没有后继的点称为T的叶结点 内部结点:树T中既有前驱又有后继的结点称为T的内部结点 (2)分支结点:树T中度数不等于0的结点为T的分支结点 非分支结点:树T中度数等于0的结点称为T的非分支结点
已知树T的度为m,采用基于顺序表的子结点表示法存储,在此基础上实施 后序遍历,输出结果。 00 Post_Tr(treenode tr[], int m,int root) 01 { 02 03 04 int k; k = root; if (k != NULL)
05
06 07 08
{
for (i=1; i<=m; i++) Post_Tr(tr[],m,i); printf ("%c", tr[k].Data); /* 访问结点 */ /* 依次后序遍历结点的各子树 */
13
6.2.3 左子/右兄弟结点表示法存储
结点由Data域(存放数据信息)、Lch域(存放该结点 第一个子结点即左子结点信息)和RS域(存放该结点第一个 兄弟结点即右兄弟结点信息)组成。
Data LCH RS
数据域
第一个孩 子下标
下一个兄 弟下标
(a)
14
6.2.3 左子/右兄弟结点表示法存储2
森林 n(n≥0)棵互不相交的树的集合,称为森林(forest)。
5
6.1.1 树的基本概念2
2、树的表示方法
① 树形表示法
A
A
② 文氏图表示法
C F E G I J H
③ 凹入表示法
A B C D E F G H I J
B D E F I
C
B D
G
H J
④ 括弧表示法 (A(B(D)(E(I)(J))(F))(C(G)(H)))
信息记录下来以便必要时能够使用。由于先达到结点的子结点,将来会 得到首先访问,所以需要采用队列方式记录结点的子结点信息以保证它 们能够依照进入队列的先后顺序得到访问。
16
例子:
以层次遍历方式访问如图所示的二叉树。
A B C D
E
F K
G
H
I
J
解: A-B-C-D-E-F-G-H-I-J-K
17
6.3.1 层次遍历2
2、层次遍历算法
步骤 初始 1 2 3 4 5 6 7 8 9 10 11 当前出队结点 — A B C D E F G H I J K 当前访问结点 — A B C D E F G H I J K 当前进队结点 A B,C,D E,F,G H I,J — K — — — — — 当前队列内容 A B,C,D C,D,E,F,G D,E,F,G,H E,F,G,H,I,J F,G,H,I,J G,H,I,J,K H,I,J,K I,J,K J,K K 空
25
§6.4 森林2
1、森林的后序遍历
若森林为空,则遍历结束; 若森林非空,则从左往右依次后序遍历森林中的每棵树,对结点
的访问顺序,即是对森林后序遍历的结点序列。 例子:以后序遍历方式访问如图所示的森林。
A C H
B
D
I
J
E
F
G
K
L
M
解: B-A-E-F-G-D-C-I-K-L-M-J-H
多个后继结点。
A
A B E F J C G H K D I L M
4
Φ
A
C G L
6.1.1 树的基本概念
1、树的基本概念3
有序树与无序树 如果树T中各子树从左至右按照一定此序排列,不
得互换,则称T是有序树(order tree),否则为无序树(unorder tree)。由此可知,二叉树是一种特殊的有序树,但不是一般树的特 例。
09
10 }
}
24
§6.4 森林
森林:若干棵树组成的集合
1、森林的先序遍历
若森林为空,遍历结束; 若森林非空,从左往右依次先序遍历森林中的每棵树,对结点的
访问顺序,即是对森林先序遍历的结点序列。
例子:以先序遍历方式访问如图所示的森林。
A C H
B
D
I
J
E
F
G
K
L
M
解: E-K-F-G-B-H-C-I-J-D-A
09
10 }
}
22
6.3.3 后序遍历
过程:
(1)若T为空,则遍历结束; (2)若T非空,则从左到右依次后序遍历根结点的各子树,然后访问
根结点。
例子:以后序遍历方式访问如图所示的二叉树。
A B C D
E
F K
G
H
I
J
解: E-K-F-G-B-H-C-I-J-D-A
23
6.3.3 后序遍历2
算法6-3 树的后序遍历递归算法
8
6.1.2 结点及其基本概念3
3、结点间关系描述
子结点:树T中一个结点N的所有直接后继,都被称作是该结点N 的子结点
父结点:树T中把一个结点称作是它所有后继结点的父结点
兄弟结点:在树T中,具有相同双亲的结点,互称为是兄弟结点 堂兄弟结点:在树T中,双亲在同一层的那些结点,互称为是堂兄
弟结点
子孙结点:一个结点的子树中的所有结点,都被称作是该结点的 子孙结点 祖先结点:从根结点到某个结点的路径上的所有分支结点,称为 该结点的祖先结点
}
20
6.3.2 先序遍历
过程:
(1)若T为空,遍历结束;
(2)若T非空,先访问T根结点,然后从左到右依次先序遍历访问根结点 的每棵子树。 例子:以先序遍历方式访问如图所示的二叉树。
A B C D
D
F K
-C-H-D-I-J
21
6.3.2 先序遍历2
算法6-2 树的先序遍历递归算法
6
6.1.2 结点及其基本概念
1、结点
结点的度:结点拥有的子树数目,即该结点的后继结点的个数
结点的深度(层次):结点位于树的层次数 树的度:一棵树中各结点度的最大值
树的深度:一棵树中各结点深度的最大值
结点间路径:从树中一个结点到另一个结点之间的分支 路径长度:一条路径上边即连接两个结点的线段的个数称为该
Data ChP1 ChP2 „ „ ChPm
数据域
指向第 1 个 孩子
指向第 2 个 孩子
指向第 m 个 孩子
这种子结点链式存储效率低下,通常不 直接采用上述方法。
11
6.2.2 子结点表示法存储
1、子结点链表存储法
① 将树T中结点按照层序进行排序。 ② 为树T中每个结点都设置一个单链表,该链表由该结点的所有子结点按照层序 进行链接。这样的链表也称为子结点链表。 ③ 将每个结点子结点链表的表头指针按照树T结点的层序集中起来组成数组Tr。
12
数组 Tr
6.2.2 子结点表示法存储2
2、子结点顺序表存储法
① 将树T的结点按照层序进行排序,组成数组Tr。 ② 对Tr中每个数组元素开辟Data域和m个子结点域:Child[1],Child[2],…, Child[m],这些子结点域分别记录每个结点的子结点信息。 下标 Data Chr[1] Chr[2 Chr[3 ③ 将数组Tr进行存储。
root
0 A B C D E F G H I J K 1 4 -1 6 -1 -1 8 -1 -1 -1 -1 ] 2 5 -1 7 -1 -1 9 -1 -1 -1 -1 ] 3 -1 -1 -1 -1 -1 10 -1 -1 -1 -1
相关主题