树.docx

上传人:b****5 文档编号:7500557 上传时间:2023-01-24 格式:DOCX 页数:38 大小:585.91KB
下载 相关 举报
树.docx_第1页
第1页 / 共38页
树.docx_第2页
第2页 / 共38页
树.docx_第3页
第3页 / 共38页
树.docx_第4页
第4页 / 共38页
树.docx_第5页
第5页 / 共38页
点击查看更多>>
下载资源
资源描述

树.docx

《树.docx》由会员分享,可在线阅读,更多相关《树.docx(38页珍藏版)》请在冰豆网上搜索。

树.docx

第六章树

一、选择题

1、二叉树的深度为k,则二叉树最多有(C)个结点。

A.2kB.2k-1C.2k-1D.2k-1

解析:

直接举例说明。

2、用顺序存储的方法,将完全二叉树中所有结点按层逐个从左到右的顺序存放在一维数组R[1..N]中,若结点R[i]有右孩子,则其右孩子是(B)。

A.R[2i-1]B.R[2i+1](右孩子)C.R[2i](左孩子)D.R[2/i]

解析:

考查二叉树的性质,父节点为i,其右孩子的结点号为2*i+1,左孩子结点的号为2*i。

3、设a,b为一棵二叉树上的两个结点,在中序遍历时,a在b前面的条件是(B)。

A.a在b的右方B.a在b的左方(左边总是先访问)C.a是b的祖先D.a是b的子孙

解析:

中序遍历顺序:

左孩子结点,父节点,右孩子结点。

4、设一棵二叉树的中序遍历序列:

badce,后序遍历序列:

bdeca,则二叉树先序遍历序列为()。

A.adbceB.decabC.debacD.abcde

解析:

将图给画出来。

5、在一棵具有5层的满二叉树中结点总数为(A)。

A.31B.32C.33D.16

6、由二叉树的前序和后序遍历序列(B)惟一确定这棵二叉树。

A.能B.不能

解析:

因为同样的前序遍历和后序遍历序列,可以对应不同的二叉树。

已知一棵二叉树的前序遍历和后序遍历序列分别为ABC和CBA,则四棵二叉树均符合要求。

7、某二叉树的中序序列为ABCDEFG,后序序列为BDCAFGE,则其左子树中结点数目为(C)。

A.3 B.2C.4D.5

8、若以{4,5,6,7,8}作为权值构造哈夫曼树,则该树的带权路径长度为(C)。

A.67 B.68C.69D.70

解析:

带权路径长度。

哈夫曼树。

9、将一棵有100个结点的完全二叉树从根这一层开始,每一层上从左到右依次对结点进行编号,根结点的编号为1,则编号为49的结点的左孩子编号为(A)。

A.98 B.99C.50D.48

10、表达式a*(b+c)-d的后缀表达式是(B)。

A.abcd+- B.abc+*d-C.abc*+d-D.-+*abcd

解析:

不需要画图,直接翻译表达式。

11、对某二叉树进行先序遍历的结果为ABDEFC,中序遍历的结果为DBFEAC,则后序遍历的结果是(B)。

A.DBFEACB.DFEBCAC.BDFECAD.BDEFAC

解析:

中序遍历比较的重要,第一个元素是最左边的,第二个元素是第二层父节点。

12、树最适合用来表示(C)。

A.有序数据元素B.无序数据元素C.元素之间具有分支层次关系的数据D.元素之间无联系的数据

13、表达式A*(B+C)/(D-E+F)的后缀表达式是(C)。

A.A*B+C/D-E+FB.AB*C+D/E-F+C.ABC+*DE-F+/D.ABCDED*+/-+

解析:

后缀表达式为:

ABC+*DE-F+/

B+C首先被翻译成BC+,然后BC+与A被翻译成ABC+*。

接着D-E被翻译成DE-,DE-与F被翻译成DE-F+,最后ABC+*与DE-F+被翻译成ABC+*DE-F+/。

14、在线索二叉树中,t所指结点没有左子树的充要条件是()。

A.t->left==NULL B.t->ltag==1C.t->ltag==1&&t->left==NULLD.以上都不对

解析:

当用二叉链表作为二叉树的储存结构是,因为每个节点中只有指向其左,右儿子结点的指针,所以从任意一个节点出发只能找到该节点的左右儿子。

在一般情况下靠它无法直接找到该节点在某种遍历下的前驱和后继结点。

如果在每个结点中增加指向其前驱和后继结点的指针,将降低储存空间的效率。

我们可以证明:

在n个节点的二叉链表中含有n+1个空指针。

因为含n个节点的二叉链表中含2n个指针,除了根节点。

每个节点都有一个从父节点指向该节点的指针,以为一共使用n-1指针,所以在n个节点的二叉链表中含有n+1个空指针。

因此我们可以利用这下空指针,存放指向结点在某种遍历次序下的前序和后继结点的指针。

这种附加的指针称为线索,加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树。

根据线索性质的不同,线索二叉树可分为前序二叉树,中序线索二叉树,后续线索二叉树。

15、任何一棵二叉树的叶结点在先序、中序和后序遍历序列中的相对次序()。

A.不发生改变 B.发生改变C.不能确定D.以上都不对

解析:

不管哪种遍历都是先左结点后右结点,因此相对次序是不发生次序。

16、假定在一棵二叉树中,度为2的结点数为15,度为1的结点数为30,则叶子结点数为()个。

A.15B.16C.17D.47

解析:

性质:

叶子节点=度数为二的结点+1

首先要明白度的概念:

度是结点的属性,即是结点的分支。

将图画出来,度为2的结点数为15,即是画四层的满二叉树。

度为1的结点数为30,接着画15个含有两个节点的单分支。

17、在下列情况中,可称为二叉树的是(B)。

A.每个结点至多有两棵子树的树 B.哈夫曼树

C.每个结点至多有两棵子树的有序树D.每个结点只有一棵子树

解析:

霍夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。

18、用顺序存储的方法,将完全二叉树中所有结点按层逐个从左到右的顺序存放在一维数组R[1..n]中,若结点R[i]有左孩子,则其左孩子是()。

A.R[2i-1]B.R[2i+1]C.R[2i]D.R[2/i]

19、下面说法中正确的是()。

A.度为2的树是二叉树B.度为2的有序树是二叉树

C.子树有严格左右之分的树是二叉树D.子树有严格左右之分,且度不超过2的树是二叉树

20、树的先根序列等同于与该树对应的二叉树的()。

A.先序序列B.中序序列C.后序序列D.层序序列

21、按照二叉树的定义,具有3个结点的二叉树有(C)种。

A.3 B.4C.5D.6

解析:

5种具有3个结点的二叉树,有2层和3层两种情况若有2层,则只有一种情况若有3层,则每层只有1个结点,一共有2*2种情况

22、由权值为3,6,7,2,5的叶子结点生成一棵哈夫曼树,它的带权路径长度为(A)。

A.51B.23C.53D.74

二、判断题

(√)1、存在这样的二叉树,对它采用任何次序的遍历,结果相同。

解析:

对的,例如只有一个根节点的二叉树,无论什么遍历次序结果都一样的。

(√)2、中序遍历一棵二叉排序树的结点,可得到排好序的结点序列。

解析:

对,二叉排序树的概念:

二叉排序树是一种动态树表。

二叉树排序的定义:

二叉排序树或者是一棵空树。

或者一颗具有如下性质的二叉树:

1.若他的左子树非空,则左子树上所有节点的值均小于根节点的值。

2.若它的右子树非空,则右子树上所有节点的值均大于根节点的值。

3.左,右子树本身又各是一颗二叉排序树。

二叉排序树的性质:

按中序遍历二叉排序树,所得到的中序遍历二叉排序树,所得道德中序遍历序列是一个递增有序序列。

(√)3、对于任意非空二叉树,要设计其后序遍历的非递归算法而不使用堆栈结构,最适合的方法是对该二叉树采用三叉链表。

解析:

若二叉树采用二叉树链表结构,则链表中只有孩子节点的地址,而无双亲节点的地址,而遍历过程中有需要结点的双亲结点的地址,为此,便利操作设置一个堆栈来达到这个目的。

如果不设置堆栈,则需要采用三叉链表结构,因为三叉链表中出了孩子节点的地址以外,还保留了结点的双亲结点的地址。

简单介绍:

霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符号出现机率的方法得到的,出现机率高的字母使用较短的编码,反之出现机率低的则使用较长的编码,这便使编码之后的字符串的平均长度、期望值降低,从而达到无损压缩数据的目的。

(×)4、在哈夫曼编码中,当两个字符出现的频率相同时,其编码也相同,对于这种情况应做特殊处理。

解析:

给定n个权值作为n的叶子节点,构造一棵二叉树,若带权路径到达最小,称这样的二叉树为最优二叉树,也称为哈夫曼树。

哈夫曼树是带权路径长队最短的树,权值较大的结点离根较近。

(√)5、一个含有n个结点的完全二叉树,它的高度是log2n+1。

(√)6、完全二叉树的某结点若无左孩子,则它必是叶结点。

三、填空题

1、具有n个结点的完全二叉树的深度是log2n+1。

2、哈夫曼树是其树的带权路径长度最小的二叉树。

3、在一棵二叉树中,度为0的结点的个数是n0,度为2的结点的个数为n2,则有n0=N2+1。

解析:

举例说明。

4、树内各结点度的最大值称为树的度。

解析:

树内各结点的度的最大值。

(结点拥有的子树数称为结点的度)

四、代码填空题

1、函数InOrderTraverse(Bitreebt)实现二叉树的中序遍历,

请在空格处将算法补充完整。

voidInOrderTraverse(BiTreebt)

{

if(bt!

=null)

{

InOrderTraverse(bt->lchild);

printf(“%c”,bt->data);

InOrderTraverse(bt->rchild);

}

}

2、函数depth实现返回二叉树的高度。

请在空格处将算法补充完整。

intdepth(Bitree*t){

if(t==NULL)

return0;

else{

hl=depth(t->lchild);

hr=depth(t->rchild);

if(hl>hr)

returnhl+1;

else

returnhr+1;

}

}

3、写出下面算法的功能。

(比较重要)

Bitree*function(Bitree*bt)

{

Bitree*t,*t1,*t2;

if(bt==NULL)

t=NULL;

Else

{

t=(Bitree*)malloc(sizeof(Bitree));

t->data=bt->data;

t1=function(bt->left);

t2=function(bt->right);

t->left=t2;

t->right=t1;

}

return(t);

}

答案:

交换二叉树左右子树结点的递归算法

4、写出下面算法的功能。

voidfunction(Bitree*t){

if(p!

=NULL){

function(p->lchild);

function(p->rchild);

printf(“%d”,p->data);

}

}

答案:

二叉树后序遍历递归算法

五、综合题

1、假设以有序对表示从双亲结点到孩子结点的一条边,若已知树中边的集合为{,,,,,,,,,},请回答下列问题:

(1)哪个结点是根结点?

(2)哪些结点是叶子结点?

(3)哪些结点是k的祖先?

(4)哪些结点是j的兄弟?

(5)树的深度是多少?

2、假设一棵二叉树的先序序列为EBADCFHGIKJ,中序序列为ABCDEFGHIJK,请画出该二叉树。

3、假设用于通讯的电文仅由8个字母A、B、C、D、E、F、G、H组成,字母在电文中出现的频率分别为:

0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10。

请为这8个字母设计哈夫曼编码。

答案:

4、已知二叉树的先序遍历序列为ABCDEFGH,中序遍历序列为CBEDFAGH,画出二叉树。

答案:

二叉树形态

解析:

这种题是先序或者后序序列,先确定根节点。

然后把中序序列分成两部分,中序序列第一个元素是整个树,最左边的元素。

第二个元素是根节点的右孩子节点。

5、试用权集合{12,4,5,6,1,2}构造哈夫曼树,并计算哈夫曼树的带权路径长度。

答案:

WPL=12*1+(4+5+6)*3+(1+2)*4=12+45+12=69

解析:

这种题没问题。

6、已知权值集合为{5,7,2,3,6,9},要求给出哈夫曼树,并计算带权路径长度WPL。

答案:

(1)树形态:

(2)带权路径长度:

WPL=(6+7+9)*2+5*3+(2+3)*4=44+15+20=79

7、已知一棵二叉树的先序序列:

ABDGJEHCFIKL;中序序列:

DJGBEHACKILF。

画出二叉树的形态。

答案:

解析:

这一题做的不容易啊。

8、一份电文中有6种字符:

A,B,C,D,E,F,它们的出现频率依次为16,5,9,3,30,1,完成问题:

(1)设计一棵哈夫曼树;(画出其树结构)

(2)计算其带权路径长度WPL;

答案:

(1)树形态:

(2)带权路径长度:

WPL=30*1+16*2+9*3+5*4+(1+3)*5=30+32+27+20+20=129

9、已知某森林的二叉树如下所示,试画出它所表示的森林。

答案:

 

解析:

有森林转化成二叉树(左孩子,右兄弟)。

树转换成二叉树是唯一的。

10、有一分电文共使用5个字符;a,b,c,d,e,它们的出现频率依次为4、7、5、2、9,试构造哈夫曼树,并给出每个字符的哈夫曼编码。

11、画出与下图所示的森林相对应的二叉树,并指出森林中的叶子结点在二叉树中具有什么特点。

解析:

由于二叉树和树都可以用二叉树链表作为储存结构,则一二叉链表作为媒介可导出树于二叉树之间的一个对应关系。

给出一棵树,可以找到为一个二叉树与之对应。

左孩子,右兄弟。

12、如下所示的二叉树,请写出先序、中序、后序遍历的序列。

答案:

先序:

FDBACEGIHJ

中序:

ABCDEFGHIJ

后序:

ACBEDHJIGF

六、编程题

1、编写求一棵二叉树中结点总数的算法。

答案:

 (以先序遍历的方法为例)

voidcount_preorder(Bitree*t,int*n)

{

if(t!

=NULL)

{

*n++;

count_preorder(t->lchild);

count_preorder(t->rchild);

}

}

 

———————————————————————————————————————

一、选择题:

1.下列关于哈夫曼树的叙述,错误的是(C)。

A.哈夫曼树根结点的权值等于所有叶结点权值之和。

B.具有n个叶结点的哈夫曼树共有2n-1个结点。

C.哈夫曼树是一棵二叉树,因此它的结点的度可以为0,1,2。

(×)

D.哈夫曼树是带权路径长度最短的二叉树。

解析:

哈夫曼树的特点:

1.哈夫曼树根节点的权值等于所有叶节点权值之和。

2.具有n个节点的哈夫曼树共有2n-1个节点。

3.哈夫曼树是带权路径长度最短的二叉树。

2.由3个结点可以构成多少棵不同形态的二叉树(C)。

A.3B.4C.5D.6

3.如果一棵二叉树结点的前序序列是A,B,C,后序序列是C,B,A,则该二叉树结点的中序序列是(D)。

A.A,B,CB.A,C,BC.B,C,AD.不能确定

解析:

前序和后序在本质上都是将父节点与子结点进行分离,但并没有指明左子树和右子树的能力。

因此得到这两个序列只能明确父子关系,而不能确定一个二叉树。

由二叉树的中序和前序遍历序列可以唯一确定一棵二叉树,由前序和后序遍历则不能唯一确定一棵二叉树。

由二叉树的中序和后序遍历序列可以唯一确定一棵二叉树,由前序和后序遍历则不能唯一确定一棵二叉树。

4.如图所示的4棵二叉树中,(B)不是完全二叉树。

A.B.C.D.

5.二叉树按某种顺序线索化后,任一结点均有指向其前趋和后继的线索,这种说法(B)

A.正确B.错误

解析:

若结点有左子树,则令其lchild指针指示其左孩子;若结点没有左子树,则令其lchild指针指示其前驱。

若结点有右子树,则令其rchild指针指示其右孩子;若结点没有右子树,则令其rchild指针指示其后继。

6.二叉树的前序遍历序列中,任意一个根结点均处在其子女结点的前面,这种说法(A)。

A.正确B.错误

解析:

根据前序的顺序。

7.对一棵70个结点的完全二叉树,它有(A)个叶子结点。

A.35B.40C.30D.44

8.设一棵二叉树中,度为1的结点数为9,则该二叉树的叶子结点的数目为(D)。

A.10B.11C.12D.不确定

n0=n2+1

解析:

D不确定..因为不知道深度,也不知道度为0和2的结点数,所以不知道一共有多少个叶结点。

9.假定根结点的层次为0(根据这个判断),含有15个结点的二叉树最小高度为(A)。

A.3B.4C.5D.6

解析:

假定根节点的层次是几,就从几开始数。

假定根结点的层次为1,含有15个结点的二叉树最小高度为4

10.若一棵二叉树中,度为2的结点数为9,该二叉树的叶子结点的数目为(A)。

A.10B.11C.12D.不确定

解析:

根据性质:

对任何一颗二叉树T,如果其终端节点数为n0,度为2的结点数为n2,则n0=n2+1。

n0=n2+1

提示一下:

终端节点也叫叶子节点。

11.设根结点的层次为0,则高度为k的二叉树的最大结点数为(C)。

A.2k-1B.2kC.2k+1-1D.2k+1

解析:

若设根结点的层次为1,则这棵树的高度为k+1,高度为k+1的二叉树的最大结点数为2k+1-1

12.以知某二叉树的后序遍历序列为abdec,先序遍历序列为cedba,它的中序遍历序列为(D)。

A.debacB.acbedC.decbaD.不确定

13.设高度为h的二叉树上只有度为0和度为2的结点,则此二叉树所包含的结点数至少为(B)。

A.2hB.2h-1(举例说明)C.2h+1D.h+1

深度——二叉树的层数,就是高度。

解析:

分析其结构,二叉树中只有度为0的结点和度为2的结点。

对于最少结点的情况,除了第一层外,其余每层都一定是两个结点,结点总数是:

1+2*(h-1)=2h-1

14.设n,m为一棵二叉树上的两个结点,在中序遍历时,n在m前的条件是(C)。

A.n在m右方B.n是m祖先C.n在m左方D.n是m子孙

解析:

根据中序遍历序列。

左孩子,父节点,右孩子。

只要是先访问n后访问m,只要n在m的左边就行了。

15.将一棵有100个结点的完全二叉树从上到下,从左到右依次对结点进行编号,根结点的编号为49的结点的左孩子编号为(A)。

A.98B.99C.50D.48

解析:

主要考察根节点和孩子结点的关系。

16.某二叉树的前序和后序序列正好相反,则该二叉树一定是(B)二叉树。

A.空或只有一个结点B.高度等于其结点数C.任一结点无左孩子D.任一结点无右孩子

解析:

选B,你可以画一棵二叉树试试,高度等于结点数,因为先序是“根左右,后序是“左右根”,要使先序序列和后序序列正好相反,则这棵二叉树必定没有左子树或右子树,而这种树的特点就是高度等于结点数。

17.对于一棵满二叉树,m个树叶,n个结点,深度为h,则(C)。

A.h+m=2nB.m=h-1C.n=2h-1D.n=h+m

解析:

m个树叶:

2

n个节点:

3

h深度:

2

n=2h-1

18.判断线索二叉树中某结p有左孩子的条件是(C)。

A.p!

=nullB.p->lchild!

=nullC.p->ltag=0D.p->ltag=1

解析:

LTag=0lchild域指示的节点的左孩子。

LTag=1lchild域指示结点的前驱。

RTag=0rchild域指示结点的右孩子。

RTag=1rchild域指示结点的右孩子。

19.对于任意非空二叉树,要设计出其后序遍历的非递归算法而不使用堆栈结构,最合适的方法是对该二叉树采用储存结构。

A.二叉链表B.广义存储结构C.三叉链表D.顺序存储结构

解析:

三叉链表是二叉树的另一种主要的链式储存结构。

三叉链表与二叉链表的主要区别在于,它的结点比二叉链表的结点多一个指针域,该域用于存储一个指向本节点双亲的指针。

专业解析:

若二叉树采用二叉树链表结构,则链表中只有孩子节点的地址,而无双亲节点的地址,而遍历过程中又需要结点的双亲节点的地址,为此,遍历操作设置一个堆栈来达到这个目的。

如果不设置堆栈,则需要采用三叉链表,因为三叉链表中除了孩子节点的地址以外,还保存了结点的双亲节点的地址。

20.在一棵二叉树结点的先序遍历序列,中序遍历序列和后序遍历序列中,所有的叶子结点的先后顺序(B)。

A.都不相同B.完全相同C.先序和中序相同,而与后序不同D.中序

和后序相同,而与先序不同

解析:

所有的叶子节点即是左孩子,右孩子结点,都是本着先左后右的顺序排列。

21.下图所示FF是森林F转换而来的二叉树,那么F一共有(C)个叶子结点。

A.4B.5C.6D.7

解析:

由森林转换成二叉树的原则是:

左孩子,右兄弟。

22.在一非空二叉树的中序遍历序列中,根结点的右边(A)。

A.只有右子树上的所有结点B.只有右子树上的部分结点

C.只有左子树上的所有结点D.只有左子树上的部分结点

解析:

在中序遍历序列中根节点把左右子树分开。

23.设森林F中有3棵树,其第一,第二和第三棵树的结点个数分别是n1,n2和n3,则与森林F相对应的二叉树根结点的右子树上的结点个数是(D)。

A.n1B.n1+n2C.n3D.n2+n3

解析:

假设第一棵树的结点数是一个节点,即是根节点。

另两个树都是该根节点的右兄弟。

举例验证。

24.假定一棵二叉树的结点数为18,则它的最小高度为(C)。

A.18B.8C.5D.4

第1层第2层第3层第4层第5层

12483

25.树最合适用来表示(C)。

A.有序数据元素B.无序数据元素C.元素之间具有分支层次关系的数据D.元素之间无联系的数据

26.以下有关数据结构的叙述正确的是(C)。

A.线性表的线性存储结构优于链式存储结构

B.二叉树的第i层上有2i-1个结点,深度为k的二叉树上有2k-1个结点。

C.二维数组是其数据元素为线性表的线性表。

D.栈的操作方式是先进先出。

二.填空题

1.有一棵树如图示,回答下面问题:

(1)这棵

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 广告传媒

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1