数据结构二叉树习题含答案上课讲义Word文档格式.docx

上传人:b****6 文档编号:20319594 上传时间:2023-01-21 格式:DOCX 页数:10 大小:62.57KB
下载 相关 举报
数据结构二叉树习题含答案上课讲义Word文档格式.docx_第1页
第1页 / 共10页
数据结构二叉树习题含答案上课讲义Word文档格式.docx_第2页
第2页 / 共10页
数据结构二叉树习题含答案上课讲义Word文档格式.docx_第3页
第3页 / 共10页
数据结构二叉树习题含答案上课讲义Word文档格式.docx_第4页
第4页 / 共10页
数据结构二叉树习题含答案上课讲义Word文档格式.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

数据结构二叉树习题含答案上课讲义Word文档格式.docx

《数据结构二叉树习题含答案上课讲义Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构二叉树习题含答案上课讲义Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。

数据结构二叉树习题含答案上课讲义Word文档格式.docx

(10)一棵非空的二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足()。

A.所有的结点均无左孩子B.所有的结点均无右孩子

C.只有一个叶子结点D.是任意一棵二叉树

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

A.空或只有一个结点B.任一结点无左子树

C.高度等于其结点数D.任一结点无右子树

(12)若X是二叉中序线索树中一个有左孩子的结点,且X不为根,则X的前驱为()。

A.X的双亲B.X的右子树中最左的结点

C.X的左子树中最右结点D.X的左子树中最右叶结点

(13)引入二叉线索树的目的是()。

A.加快查找结点的前驱或后继的速度B.为了能在二叉树中方便的进行插入与删除

C.为了能方便的找到双亲D.使二叉树的遍历结果唯一

(14)线索二叉树是一种()结构。

A.逻辑B.逻辑和存储C.物理D.线性

(15)设F是一个森林,B是由F变换得的二叉树。

若F中有n个非终端结点,则B中右指针域为空的结点有()个。

A.n-1B.nC.n+1D.n+2

2.应用题

(1)试找出满足下列条件的二叉树

先序序列与后序序列相同

中序序列与后序序列相同

先序序列与中序序列相同

中序序列与层次遍历序列相同

先序遍历二叉树的顺序是“根—左子树—右子树”,中序遍历“左子树—根—右子树”,后序遍历顺序是:

“左子树—右子树―根",根据以上原则,本题解答如下:

(1) 

若先序序列与后序序列相同,则或为空树,或为只有根结点的二叉树

(2) 

若中序序列与后序序列相同,则或为空树,或为任一结点至多只有左子树的二叉树.

(3) 

若先序序列与中序序列相同,则或为空树,或为任一结点至多只有右子树的二叉树.

(4) 

若中序序列与层次遍历序列相同,则或为空树,或为任一结点至多只有右子树的二叉树

(2)设一棵二叉树的先序序列:

ABDFCEGH,中序序列:

BFDAGEHC

画出这棵二叉树。

画出这棵二叉树的后序线索树。

将这棵二叉树转换成对应的树(或森林)。

(1)

(2)

(3)假设用于通信的电文仅由8个字母组成,字母在电文中出现的频率分别为0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10。

试为这8个字母设计赫夫曼编码。

试设计另一种由二进制表示的等长编码方案。

对于上述实例,比较两种方案的优缺点。

解:

方案1;

哈夫曼编码

先将概率放大100倍,以方便构造哈夫曼树。

w={7,19,2,6,32,3,21,10},按哈夫曼规则:

【[(2,3),6],(7,10)】,……19,21,32

(100)

(40)(60)

192132(28)

(17)(11)

7106(5)

23

方案比较:

方案1的WPL=2(0.19+0.32+0.21)+4(0.07+0.06+0.10)+5(0.02+0.03)=1.44+0.92+0.25=2.61

方案2的WPL=3(0.19+0.32+0.21+0.07+0.06+0.10+0.02+0.03)=3

结论:

哈夫曼编码优于等长二进制编码

(4)已知下列字符A、B、C、D、E、F、G的权值分别为3、12、7、4、2、8,11,试填写出其对应哈夫曼树HT的存储结构的初态和终态。

初态:

weight

parent

lchild

rchild

1

3

2

12

7

4

5

6

8

11

9

10

13

15

20

27

47

终态

3.算法设计题

以二叉链表作为二叉树的存储结构,编写以下算法:

(1)统计二叉树的叶结点个数。

intLeafNodeCount(BiTreeT)

{

if(T==NULL)

return0;

//如果是空树,则叶子结点个数为0

elseif(T->

lchild==NULL&

&

T->

rchild==NULL)

return1;

//判断该结点是否是叶子结点(左孩子右孩子都为空),若是则返回1

else

returnLeafNodeCount(T->

lchild)+LeafNodeCount(T->

rchild);

}

(2)判别两棵树是否相等。

(3)交换二叉树每个结点的左孩子和右孩子。

voidChangeLR(BiTree&

T)

BiTreetemp;

if(T->

return;

{

temp=T->

lchild;

T->

lchild=T->

rchild;

rchild=temp;

}

ChangeLR(T->

lchild);

(4)设计二叉树的双序遍历算法(双序遍历是指对于二叉树的每一个结点来说,先访问这个结点,再按双序遍历它的左子树,然后再一次访问这个结点,接下来按双序遍历它的右子树)。

voidDoubleTraverse(BiTreeT)

if(T==NULL)

cout<

<

data;

DoubleTraverse(T->

(5)计算二叉树最大的宽度(二叉树的最大宽度是指二叉树所有层中结点个数的最大值)。

[题目分析]求二叉树高度的算法见上题。

求最大宽度可采用层次遍历的方法,记下各层结点数,每层遍历完毕,若结点数大于原先最大宽度,则修改最大宽度。

intWidth(BiTreebt)//求二叉树bt的最大宽度

{if(bt==null)return(0);

//空二叉树宽度为0

else

{BiTreeQ[];

//Q是队列,元素为二叉树结点指针,容量足够大

front=1;

rear=1;

last=1;

//front队头指针,rear队尾指针,last同层最右结点在队列中的位置

temp=0;

maxw=0;

//temp记局部宽度,maxw记最大宽度

Q[rear]=bt;

//根结点入队列

while(front<

=last)

{p=Q[front++];

temp++;

//同层元素数加1

if(p->

lchild!

=null)Q[++rear]=p->

//左子女入队

if(p->

rchild!

//右子女入队

if(front>

last)//一层结束,

{last=rear;

if(temp>

maxw)maxw=temp;

//last指向下层最右元素,更新当前最大宽度

}//if

}//while

return(maxw);

}//结束width

(6)用按层次顺序遍历二叉树的方法,统计树中具有度为1的结点数目。

intLevel(BiTreebt)//层次遍历二叉树,并统计度为1的结点的个数

{intnum=0;

//num统计度为1的结点的个数

if(bt){QueueInit(Q);

QueueIn(Q,bt);

//Q是以二叉树结点指针为元素的队列

while(!

QueueEmpty(Q))

{p=QueueOut(Q);

printf(p->

data);

//出队,访问结点

if(p->

lchild&

!

p->

rchild||!

p->

rchild)num++;

//度为1的结点

lchild)QueueIn(Q,p->

//非空左子女入队

rchild)QueueIn(Q,p->

//非空右子女入队

}}//if(bt)

return(num);

}//返回度为1的结点的个数

(7)求任意二叉树中第一条最长的路径长度,并输出此路径上各结点的值。

[题目分析]因为后序遍历栈中保留当前结点的祖先的信息,用一变量保存栈的最高栈顶指针,每当退栈时,栈顶指针高于保存最高栈顶指针的值时,则将该栈倒入辅助栈中,辅助栈始终保存最长路径长度上的结点,直至后序遍历完毕,则辅助栈中内容即为所求。

voidLongestPath(BiTreebt)//求二叉树中的第一条最长路径长度

{BiTreep=bt,l[],s[];

//l,s是栈,元素是二叉树结点指针,l中保留当前最长路径中的结点

inti,top=0,tag[],longest=0;

while(p||top>

0)

{while(p){s[++top]=p;

tag[top]=0;

p=p->

Lc;

}//沿左分枝向下

if(tag[top]==1)//当前结点的右分枝已遍历

{if(!

s[top]->

Lc&

Rc)//只有到叶子结点时,才查看路径长度

if(top>

longest){for(i=1;

i<

=top;

i++)l[i]=s[i];

longest=top;

top--;

//保留当前最长路径到l栈,记住最高栈顶指针,退栈

elseif(top>

0){tag[top]=1;

p=s[top].Rc;

}//沿右子分枝向下

}//while(p!

=null||top>

}//结束LongestPath

(8)输出二叉树中从每个叶子结点到根结点的路径。

[题目分析]采用先序遍历的递归方法,当找到叶子结点*b时,由于*b叶子结点尚未添加到path中,因此在输出路径时还需输出b->

data值。

对应的递归算法如下:

voidAllPath(BTNode*b,ElemTypepath[],intpathlen)

inti;

if(b!

=NULL)

if(b->

lchild==NULL&

b->

rchild==NULL)//*b为叶子结点

cout<

"

<

data<

到根结点路径:

"

for(i=pathlen-1;

i>

=0;

i--)

endl;

path[pathlen]=b->

//将当前结点放入路径中

pathlen++;

//路径长度增1

AllPath(b->

lchild,path,pathlen);

//递归扫描左子树

rchild,path,pathlen);

//递归扫描右子树

pathlen--;

//恢复环境

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

当前位置:首页 > 表格模板 > 合同协议

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

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