7  树和森林
树形结构是一类重要的非线性结构。树形结构的特点是结点之间具有层次关系。本章介绍树的定义、存储结构、树的遍历方法、树和森林与二叉树之间的转换以及树的应用等内容。
重点提示:
树的存储结构
树的遍历
树和森林与二叉树之间的转换
7-1  重点难点指导
7-1-1  相关术语
1.树的定义树是n(n>=0)个结点的有限集T,T为空时称为空树,否则它满足如下两个条件:①有且仅有一个特定的称为根的结点;②其余的结点可分为m(m>=0)个互不相交的子集T1,T2,…,Tm,其中每个子集本身又是一棵树,并称为根的子树。
要点:树是一种递归的数据结构。
2.结点的度:一个结点拥有的子树数称为该结点的度。
3.树的度:一棵树的度指该树中结点的最大度数。如图7-1所示的树为3度树。
4.分支结点:度大于0的结点为分支结点或非终端结点。如结点a、b、c、d。
5.叶子结点:度为0的结点为叶子结点或终端结点。如e、f、g、h、i。
6.结点的层数:树是一种层次结构,根结点为第一层,根结点的孩子结点为第二层,…依次类推,可得到每一结点的层次。
7.兄弟结点:具有同一父亲的结点为兄弟结点。如b、c、d;e、f;h、i。
8.树的深度:树中结点的最大层数称为树的深度或高度。
9.有序树:若将树中每个结点的子树看成从左到右有次序的(即不能互换),则称该树为有序树,否则称为无序树。
10.森林:是m棵互不相交的树的集合。
7-1-2  树的存储结构
1.双亲链表表示法
以图7-1所示的树为例。
a
c
d
b
h
i
g
f
e
图7-1  一棵深度为3的树

(1)存储思想:因为树中每个元素的双亲是惟一的,因此对每个元素,将其值和一个指向双亲的指针parent构成一个元素的结点,再将这些结点存储在向量中。
(2)存储示意图:       
                      0  1  2  3  4  5  6  7  8  9      MaxTreeSize-1
data:
a
b
c
d
e
f
g
h
i
  …
parent:
-1
0
0
0
1
1
2
3
3
  …
(3)注意: Parrent域存储其双亲结点的存储下标,而不是存放结点值。
下面的存储是不正确的:
                      0  1  2  3  4  5  6  7  8  9      MaxTreeSize-1
data:
a
b
c
d
e
f
g
h
i
parent:
-1
a
a
a
b
b
c
d
d
2.孩子链表表示法
(1)存储思想:
将每个数据元素的孩子拉成一个链表,链表的头指针与该元素的值存储为一个结点,树中各结点顺序存储起来,一般根结点的存储号为0。
(2)存储示意图:
2
                      data  firstchild    child next
0
A
3
1
B
4
5
2
C
6
3
D
7
8
4
E
5
F
6
G
7
H
8
I
图7-2  孩子链表存储示意图
(3)需注意的问题:
① 每个结点的孩子结点的child域存放该孩子的存储序号,而不是存放其结点的值。
② 孩子链表的最后一个结点的next域置入空指针。
③ 叶子结点的firstchild域也要置入空指针。
3.双亲-孩子兄弟链表表示法
将双亲表示和孩子兄弟链表表示法结合起来。
4.孩子兄弟链表表示法
(1)存储思想是:树中每个数据元素存储为一个结点,结点的结构如下:
leftmostchild
data
rightsilling
其中:data为该数据元素的信息;
leftmostchild为该元素第一个孩子的指针;
rightsilling 为该元素右兄弟的指针。
(2)存储示意图:
    a 
    b 
g 
  f 
  c 
  d 
  e 
  i 
  h 
图7-3  孩子-双亲链表存储示意图
7-1-3  树的基本运算
1.树的遍历
(1)先根遍历:若树T非空,则:
① 访问根结点R;
② 依次先根遍历根R的各个子树T1、T2、…、Tk先序中序后序遍历二叉树。
(2)后根遍历:若树T非空,则:
① 依次后根遍历根R的各个子树T1、T2、…、Tk
② 访问根结点R。
2.森林的遍历
(1)前序遍历:若森林F非空,则
① 访问森林中第一棵树的根结点;
前序遍历第一棵树的根结点的子树;
前序遍历去掉第一棵树后的子森林。
(2)中序遍历:若森林F非空,则
① 中序遍历第一棵树的根结点的子树;
② 访问森林中第一棵树的根结点;
③ 中序遍历去掉第一棵树后的子森林。
7-1-4  树、森林和二叉树的相互转换
1.树转换成为二叉树
要点:
(1)转换规则:
① 原树的根仍为转换后二叉树的根;
② 原树中每一个非终端结点的第一个孩子转换后成为其双亲的左孩子;
③ 原树中每一个结点右边的第一个兄弟孩子转换后成为它的右孩子。
(2)转换为二叉树后的特点:
① 所转换成的二叉树其根结点的右子树为空;
② 其二叉链表可解释为原树的孩子-兄弟链表。
2.森林转换为二叉树
要点:
转换规则:将森林中第二棵树的树根结点视为第一棵树树根的第一个兄弟,第三棵树的树根结点视为第二棵树树根的第一个兄弟,依次类推,仍按树的转换规则进行即可。
7-2  典型例题解析
7-2-1  选择题
1.以下说法错误的是(  )。
A.存在这样的二叉树,对其采用任何次序的遍历其结点访问序列均相同。
B.二叉树是树的特殊情形。
C.由树转换成二叉树,其根结点的右子树总是空的。
D.在二叉树只有一棵子树的情况下,也要指出是左子树还是右子树。
【分析】二叉树的特点是仅有一个分支时也有左右之分,而树无此特点,也即二叉树不是树的特殊情形。
【答案】B
2.如果T是由有序树T转换而来的二叉树,那么T中结点的后序就是T中结点的(  )。
A.先序            B.中序            C.后序            D.层次序
【分析】树的先序遍历序列与其转换的二叉树的先序遍历序列相同,树的后序遍历序列与其转换的二叉树的中序遍历序列相同。
【答案】B
3.若一个具有N个顶点,K条边的无向图是一个森林(N>K),则该森林中必有(  )棵树。
A.K                B.N            C.N-K        D.1
【分析】由于一棵有n个顶点的树具有n-1条边,故设森林中有m棵树,每棵树有vi个顶点(1≤i≤m),则有:
v1+v2+…+vm=N
(v1-1)+(v2-1)+…+(vm-1)=K
以上两式相减得:m=N-K。
【答案】C
4.设F是一个森林,B是由F变换得到的二叉树。若F中有n个非终端结点,则B中右指针域为空的结点有(  )个。
A.n-1            B.n            C.n+1            D.n+2
【分析】通过一个简单的森林及其对应二叉树的实例即可确定答案。
【答案】C
7-2-2  判断题
1.由树转换成二叉树,根结点没有左子树。
【分析】由树转换成二叉树,根结点必有左子树而没有右子树。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。