第六章 树
一、基本要求、重点、难点
本章目的是介绍二叉树的定义、性质、存储结构、遍历,树的定义、存储结构、遍历、树和森林与二叉树的转换,哈夫曼树等内容。本章重点是掌握二叉树的遍历算法及有关应用。难点是使用本章所学到的有关知识设计出有效算法,解决与树或二叉树相关的应用问题。
二、考核目标、考核要求
1.树的概念,要求达到“理解”层次
1.1树的逻辑结构特征。
1.2树的不同表示方法。
1.3树的常用术语及含义。
2. 二叉树,要求达到“简单应用”层次
2.1二叉树的递归定义及树与二叉树的差别。
2.2二叉树的性质、了解相应的证明方法。
2.3二叉树的两种存储方法、特点及适应范围。
3. 二叉树的遍历,要求达到“综合应用”层次
3.1二叉树的三种遍历算法,理解其执行过程。
3.2确定三种遍历所得到的相应的结点访问序列。
3.3以遍历算法为基础,设计有关算法解决简单的应用问题。
4. 树和森林,要求达到“理解”层次
4.1树和森林与二叉树的转换方法。
4.2树的各种存储结构及其特点。
4.3树的两种遍历方法。
5. 哈夫曼树及其应用,要求达到“简单应用”层次
5.1最优二叉树和最优前缀码的概念及特点。
5.2哈夫曼算法的思想。
5.3根据给定的叶结点及其权值构造出相应的最优二叉树。
5.4根据最优二叉树构造对应的哈夫曼编码。
三、练习题
1.单项选择题
1.1 设深度为K的二叉树上只有度为0和度为2的结点,则此类二叉树中所包含的结点数至少为( )
A) k+1 B)2k+1 C) 2k-1 D) 2k
1.2 按二叉树的定义,具有3个结点的二叉树有( )种
A) 5 B)4 C) 3 D) 6
1.3 深度为6的二叉树至多有( )个结点
A) 16 B)32 C) 64 D)63
1.4 二叉树的第6层上最多有( )个结点
A) 16 B)32 C) 64 D) 63
1.5 深度为6的完全二叉树至少有( )个结点
A) 31 B)32 C) 63 D) 64
1.6 某二叉树共有4个叶结点,则其度为2的结点数共有( )个
A) 5 B)4 C) 3 D)无法计算
1.7 某二叉树只有度为0和度为2的结点,其中度为2结点数为8个,则该二叉树共有( )个结点
A) 15 B)17 C) 16 D) 无法计算
1.8 从1开始,对满二叉树从树根起,自上层到下层,每层从左到右给每个结点顺序编号,其第8层(假设第8层存在)第一个结点的编号是( )
A) 256 B)255 C) 127 D) 128
1.9 某完全二叉树共有68个结点,从1开始,对其从树根起,自上层到下层,每层从左到右给每个结点顺序编号,编号为32的结点的左孩子的编号是( )
A) 16 B)64 C) 65 D) 无左孩子
1.10 某完全二叉树共有92个结点,从1开始,对其从树根起,自上层到下层,每层从左到右给每个结点顺序编号,编号为46的结点的右孩子的编号是( )
A) 23 B)24 C) 92 D) 无右孩子
1.11 某完全二叉树共有48个结点,从1开始,对其从树根起,自上层到下层,每层从左到右给每个结点顺序编号,编号为15的结点的双亲结点的编号是( )
A) 7 B)8 C)30 D)31
1.12 如果T2是由有序树T转换而来的二叉树,那么T中结点的前序就是T2中结点的( )
A) 前序 B)中序 C) 后序 D)层次序
1.13 如果T2是由有序树T转换而来的二叉树,那么T中结点的后序就是T2中结点的( )
A) 前序 B)中序 C) 后序 D)层次序
1.14 树的基本遍历策略可分为先根遍历和后根遍历;二叉树的基本遍历策略可分为先序遍历、中序遍历、后序遍历。这里,我们把由树转化得到的二叉树叫做这棵树的对应二叉树,结论( )是正确的
A) 树的先根遍历序列与其对应的二叉树的先序遍历序列相同
B) 树的后根遍历序列与其对应的二叉树的后序遍历序列相同
C) 树的先根遍历序列与其对应的二叉树的中序遍历序列相同
D) 以上都不对
1.15 任何一棵二叉树的叶结点在先序、中序和后序遍历序列中的相对次序( )
A) 不发生改变 B) 发生改变 C)不能确定 D) 都不对
1.16 一棵哈夫曼树,共有13个叶结点,则该哈夫曼树的结点总数为( )
A) 25 B) 26 C) 27 D) 无法计算
1.17 一棵非空的二叉树的前序遍历序列和后序遍历序列正好相反,则该二叉树一定满足( )
A) 其中任意一个结点均无左孩子
B) 其中任意一个结点均无右孩子
C) 其中只有一个叶子结点
D) 是任意一棵二叉树
1.18 将一棵有100个结点的完全二叉树从根这一层开始,每一层从左至右依次对结点进行编号,根结点编号为1,则编号为49的结点的左孩子编号为( )
A) 98 B)99 C) 50 D) 48
1.19 有64个结点的完全二叉树(根的层次为1)的深度为( )
A) 8 B)7 C)6 D)5
1.20 一棵深度为k的二叉树完全二叉树至少有( )个结点
A) 2k B)2k-1 C)2k+1 D) 2k-1
2.填空
2.1 深度为K的完全二叉树上至多有[ ]个结点。
2.2 深度为K的完全二叉树上至少有[ ]个结点。
2.3 在一棵二叉树中,度为0的结点数为n0,度为2的结点数为[ ]。
2.4 一棵二叉树的第i(i≥1)层最多有[ ]个子结点。
2.5 一棵完全二叉树共有25个结点,其深度为[ ]。
2.6 深度为5的满二叉树中共有[ ]个度为1的结点。
2.7 在具有n个结点的二叉树的二叉链表中,共有[ ]个空链域。
2.8 有n个叶结点的哈夫曼树共有[ ]个结点。
2.9 树的后根遍历序列与其对应二叉树的[ ]遍历序列相同。
2.10 树的三种常用表示法中方便于求双亲或祖先结点,但求指定结点的孩子或其后代则可能要遍历整个树的表示法是[ ]。
2.11 树的三种常用表示法中方便于实现涉及孩子及其子孙的运算,但不便于实现与双亲有关的运算的表示法是[ ]。
2.12 二叉树的顺序存储结构中,一棵只有k个结点的二叉树最多需[ ]个结点的存储空间。
2.13 对任何一个二叉树,如果其终端结点数8个,则其度为2的结点数为[ ]个。
2.14 一棵哈夫曼树,如果其非叶结点数17个,则该二叉树共有[ ]个结点。
3.简答
3.1 树
3.2 二叉树
3.3 遍历
3.4 哈夫曼树
4.应用
4.1 已知一棵二叉树的中序遍历序列为dgbaechf,前序遍历序列abdgcefh,画出该二叉树,并求出该二叉树的后序遍历序列。
4.2 已知一棵二叉树的中序遍历序列为cbafehgd,后序遍历序列cbfhgeda,画出该二叉树,并求出该二叉树的先序遍历序列。
4.3 已知森林F如图6.1所示,请画出其对应的二叉树BT
图6.1
4.4 给出一棵树T,如图6.2,画出它的孩子链表表示法的表示。
图6.2
4.5 给出一棵树T,如图6.3所示,分别使用双亲表示法的表示。
图6.3
4.6 给出一棵树T,如图6.3所示,画出用孩子兄弟表示法的表示。
图6.4
4.7 请用分别以8,11,13,5,17,25,21作为权值的叶结点,构造一棵哈夫曼树,并求该二叉树的带权路径长度。
5.算法
5.1 void CreateHuffmanTree(HuffmanTree T)
{//构造哈夫曼树,T[m-1]为其根结点
int i,p1,p2;
InitHuffmanTree(T); //将T初始化
InputWeight(T); //输入叶子权值至T[0..n-1]的weight域
for ( ) { //共进行n-1次合并,新结点依次存于T[i]中
Select(T,i-1,&p1,&p2);
//在T[0. .i-1]选择两个权值最小的根结点,其序号分别为s1和s2
;
T[i].lchild=p1; //最小权值的根结点是新结点的左孩子
T[i].rchild=p2; //最小权值的根结点是新结点的右孩子
T[i].weight=T[p1].weight+T[p2]. weight;
}
}
1.单项选择题
1.1 C 1.2 A 1.3 D 1.4 B 1.5 B
1.6 C 1.7 B 1.8 D 1.9 B 1.10 D
1.11 A 1.12 A 1.13 B 1.14 A 1.15 A
1.16 A 1.17 C 1.18 A 1.19 B 1.20 B
2.填空
2.1 2k-1 2.2 2k-1 2.3 n0-1
2.4 2i-1 2.5 5 2.6 0
2.7 n+1 2.8 2n-1 2.9 中序
2.10 双亲链表表示法 2.11 孩子链表表示法
2.12 2k-1 2.13 7 2.14 18
3.简答
3.1 树:是n(n≥0)个结点的有限集T,T为空时称空树,否则它满足如下两个条件:有且仅有一个特定的称为根的结点;其余的结点可分为m(m≥0)个互不相交的子集T1,T2,…,Tm,其中每个子集本身又是一棵树,并称其为根的子树。
3.2 二叉树:是n(n≥0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及两个互不相交的、分别称作这个根的左子树和右子树的二叉树组成。
3.3 树的遍历:是指沿着某条搜索路线,依次对树中的每个结点均做一次且仅做一次访问。
3.4 哈夫曼树:在权为w1,w2,…,wn的n个结点所构成的所有二叉树中,带权路径长度最小的二叉树称为最优二叉树,又称哈夫曼树。
4.应用
4.1
后序遍历序列:gdbehfca
4.2 先序遍历序列:abcdefgh
4.3
4.4 data firstchild
root→ 0
1
2
3
4
5
6
7
8
9
4.5
下标 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | MaxTreeSize-1 ↓ | ||
data | A | B | C | D | E | F | G | H | I | J |
| … |
|
parent | -1 | 0 | 0 | 0 | 1 | 1 | 2 | 3 | 3 | 3 |
| … |
|
4.6
T
4.7 假设7个结点分别为a、b、c、d、e、f、g,它们对应的权值为8、11、13、5、17、25、21,构造的哈夫曼树如下:
该哈夫曼树的带权路径长度为:
WPL=8×4+5×4+17×3+11×3+13×3+25×2+21×2
=287
100
45 55
21 24 25 30
11 13 17 13
8 5
5.算法
5.1 i=n;i<m;i++
T[p1].parent= T[p2].parent=i