数据结构与算法3.docx

上传人:b****6 文档编号:8457123 上传时间:2023-01-31 格式:DOCX 页数:17 大小:105.32KB
下载 相关 举报
数据结构与算法3.docx_第1页
第1页 / 共17页
数据结构与算法3.docx_第2页
第2页 / 共17页
数据结构与算法3.docx_第3页
第3页 / 共17页
数据结构与算法3.docx_第4页
第4页 / 共17页
数据结构与算法3.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

数据结构与算法3.docx

《数据结构与算法3.docx》由会员分享,可在线阅读,更多相关《数据结构与算法3.docx(17页珍藏版)》请在冰豆网上搜索。

数据结构与算法3.docx

数据结构与算法3

第三次作业

一、选择题

1、在按行优先顺序存储的三元组表中,下述陈述错误的是D。

A.同一行的非零元素,是按列号递增次序存储的

B.同一列的非零元素,是按行号递增次序存储的

C.三元组表中三元组行号是非递减的

D.三元组表中三元组列号是非递减的

2、在稀疏矩阵的三元组表示法中,每个三元组表示D。

A.矩阵中非零元素的值

B.矩阵中数据元素的行号和列号

C.矩阵中数据元素的行号、列号和值

D.矩阵中非零数据元素的行号、列号和值

3、对特殊矩阵采用压缩存储的目的主要是为了D。

A.表达变得简单B.对矩阵元素的存取变得简单

C.去掉矩阵中的多余元素D.减少不必要的存储空间

4、广义表是线性表的推广,它们之间的区别在于A。

A.能否使用子表B.能否使用原子项

C.表的长度D.是否能为空

5、已知广义表(a,b,c,d)的表头是A,表尾是D。

A.aB.()C.(a,b,c,d)D.(b,c,d)

6、下面说法不正确的是A。

A.广义表的表头总是一个广义表B.广义表的表尾总是一个广义表

C.广义表难以用顺序存储结构表示D.广义表可以是一个多层次的结构

7、若广义表A满足Head(A)=Tail(A),则A为C。

A.()B.(())C.((),())D.((),(),())

8、在一棵树中,如果结点A有3个兄弟,B是A的双亲,则B的度为D

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

9、深度为h的完全二叉树至少有D个结点,至多有B个结点

A.2hB.2h-1C.2h+1D.2h-1

10、具有n个结点的满二叉树有C个叶结点。

A.n/2B.(n-1)/2C.(n+1)/2D.n/2+1

11、一棵具有25个叶结点的完全二叉树最多有C个结点。

A.48B.49C.50D.51

12、已知二叉树的先根遍历序列是ABCDEF,中根遍历序列是CBAEDF,则后根遍历序列是A。

A.CBEFDAB.FEDCBAC.CBEDFAD.不定

13、具有10个叶结点的二叉树中有B个度为2的结点。

A.8B.9C.10D.11

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

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

C.只有一个叶子结点D.A和B同时成立

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

A.t->left=NULLB.t->ltag=TRUE

C.t->ltag=TRUE且t->left=NULLD.以上都不对

16、n个结点的线索二叉树上含有的线索数为C。

A.2nB.n-1C.n+1D.n

二、填空题

1、稀疏矩阵一般压缩存储的方式有三种,分别是三元数组存储、行指针链表和十字链表。

2、二维数组M中每个元素的长度是3字节,行下标i从0~7,列下标j从0~9,从首地址&M[0][0]开始连续存放在存储器中。

若按行优先的方式存放,元素M[7][5]的起始地址为

M[0][0]+228;若按列优先方式存放,元素M[7][5]的起始地址为M[0][0]+144。

3、广义表(a,(a,b),d,e,((i,j),k))的长度是5,深度是3。

4、设广义表A(((),(a,(b),c))),则Cal(Cdr(Cal(Cdr(Cal(A))))=(b)

5、一棵二叉树有67个结点,结点的度是0和2。

问这棵二叉树中度为2的结点有33个。

6、含A,B,C三个结点的不同形态的二叉树有5棵。

7、含有4个度为2的结点和5个叶子结点的完全二叉树,有1个度为1的结点。

8、具有100个结点的完全二叉树的叶子结点数为50。

9、在用左右链表示的具有n个结点的二叉树中,共有2n个指针域,其中n-1个指针域用于指向其左右孩子,剩下的n+1个指针域是空的。

三、试编写一个求三元组顺序表示的稀疏矩阵对角线元素之和的算法

intarray[Maxlength][3];

intmain()

{

cout<<"输入元素总个数:

";

intnum;cin>>num;

for(inti=0;i

{

cout<<"输入第"<

";

cin>>array[i][0]>>array[i][1]>>array[i][2];

}

for(inti=0;i

for(intj=i+1;j

if(array[i][0]>array[j][0]||(array[i][0]==array[j][0]&&array[i][1]>array[j][1]))

{

inttmp=array[i][0];array[i][0]=array[j][0];array[j][0]=tmp;

tmp=array[i][1];array[i][1]=array[j][1];array[j][1]=tmp;

tmp=array[i][2];array[i][2]=array[j][2];array[j][2]=tmp;

}

cout<<"三元组内数据为:

"<

cout<<"行号"<<'\t'<<"列号"<<'\t'<<"元素值"<

for(inti=0;i

cout<

intsum=0;

for(inti=0;i

if(array[i][0]==array[i][1])sum+=array[i][2];

cout<<"对角线元素和为:

";cout<

system("pause");return0;

}

四、当具有相同行值和列值的稀疏矩阵A和B均以三元组顺序表方式存储时,试写出矩阵相加的算法,其结果存放在以行逻辑链接顺序表方式存储的矩阵C中。

intarray1[Maxlength][3],intarray2[Maxlength][3];intarray[Maxlength][Maxlength];

intmain()

{

cout<<"输入第一个数组元素总个数:

";

intnum1;cin>>num1;

intMaxn=0;intMaxm=0;

for(inti=0;i

{

cout<<"输入第"<

";

cin>>array1[i][0]>>array1[i][1]>>array1[i][2];

if(array1[i][0]>Maxn)Maxn=array1[i][0];

if(array1[i][1]>Maxm)Maxm=array1[i][1];

}

cout<<"输入第二个数组元素总个数:

";

intnum2;cin>>num2;

for(inti=0;i

{

cout<<"输入第"<

";

cin>>array2[i][0]>>array2[i][1]>>array2[i][2];

if(array2[i][0]>Maxn)Maxn=array1[i][0];

if(array2[i][1]>Maxm)Maxm=array2[i][1];

}

for(inti=0;i<=Maxn;i++)

for(intj=0;j<=Maxm;j++)array[i][j]=0;

for(inti=0;i

for(inti=0;i

cout<<"合并后的矩阵行、列分别为:

"<

cout<<"合并后的矩阵元素为:

"<

for(inti=0;i<=Maxn;i++)

{

for(intj=0;j<=Maxm;j++)cout<

cout<

}

system("pause");

return0;

}

五、设有一个稀疏矩阵:

1、写出三元组顺序表存储表示

2、写出十字链表存储的顺序表示

(1)A=

(2)

六、画出广义表LS=((),(e),(a,(b,c,d)))的头尾链表存储结构(类似于教材P70图2-27.9)。

要求:

按照教材中的事例画出相应的图形,不需要编程。

其中第一个节点如下:

七、试编写求广义表中原子元素个数的算法。

要求:

1、定义广义表的节点的型;

2、定义广义表的基本操作;

3、定义本题要求的函数intelements(listpointerL);函数返回值为广义表中原子的个数。

例如,广义表(a,b,c,d)原子的个数为4,而广义表(a,(a,b),d,e,((i,j),k))中院子的个数为3。

提示:

先利用基本操作Cal(L)获得表头,判断表头是不是原子,再利用基本操作Cdr(L)获得除第一个元素外的其他元素所形成的表L1,利用递归的方法求L1中原子的个数。

#include

usingnamespacestd;

structlistnode{

listnode*link;

booleantag;

union{

chardata;

listnode*dlink;

}element;

};

typedeflistnode*listpointer;

booleanEqual(listpointerS,listpointerT)

{

booleanx,y=FALSE;

if((S==NULL)&&(T==NULL))y=TRUE;

elseif((S!

=NULL)&&(T!

=NULL))

if(S->tag==T->tag)

{

if(S->tag==FALSE)

{

if(S->element.data==T->element.data)

x=TRUE;

else

x=FALSE;

}

else

x=Equal(S->element.dlink,T->element.dlink);

}

if(x==TRUE)

y=Equal(S->link,T->link);

}

returny;

}

intelements(listpointerL)

{

if(L==NULL)

return0;

if(L->tag==0)

return(elements(L->next)+1);

else

return(elements(L->next)+elements(L->val.sublist));

system("pause");

return0;

}

八、试分别画出具有4个结点的二叉树的所有不同形态。

9、已知一棵二叉树的中根序列和后根序列分别是BDCEAHFG和DECBHGFA,请画出此二叉树。

十、已知非空二叉树T,写一个算法,求度为2的结点的个数。

要求:

1、定义二叉树的抽象数据类型和型BTREE,并定义基本操作。

2、编写函数count2(BTREET),返回度为2的节点的个数。

3、在主函数中,构建一个二叉树,并验证所编写的算法。

#include

usingnamespacestd;

structnode{

node*lchild;

chardata;

node*rchild;

};

typedefnode*BTREE;

voidcreatebtree(BTREE&root)

{

charch;

cin>>ch;

if(ch=='*')

{

root=NULL;

return;

}

root=newnode;

root->data=ch;

root->lchild=NULL;

root->rchild=NULL;

createbtree(root->lchild);

createbtree(root->rchild);

}

intcount2(BTREE&r)

{

intcount=0;

if(r==NULL)

return0;

if((r->lchild)&&(r->rchild))

count=1;

returncount+count2(r->lchild)+count2(r->rchild);

}

voidmain()

{

BTREEroot;

createbtree(root);

cout<

system("pause");

return0;

}

十一、用递归方法写一个算法,求二叉树的叶子结点数intleafnum(BTREET)。

要求:

1、定义二叉树的抽象数据类型和型BTREE,并定义基本操作。

2、编写函数leafnum(BTREET),返回树T的叶子节点的个数。

在主函数中,构建一个二叉树,并验证所编写的算法。

#include

usingnamespacestd;

structnode{

structnode*lchild;

structnode*rchild;

datatypedata;

};

typedefstructnode*BTREE;

datatypeData(BTREEBT)

{

returnBT->data;

}

BTREECreateBT(datatypev,BTREEltree,BTREErtree)

{

BTREEroot;

root=newnode;

root->data=v;

root->lchild=ltree;

root->rchild=rtree;

returnroot;

}

BTREECreateBtree(BTREE&T,char*&str)

{

charch;

ch=*str++;

if(ch=='#')t=NULL;

else{

if(!

(T=newnode))

exit

(1);

T->data=ch;

CreateBtree(T->lchild,str);

CreateBtree(t->rchild,str);

}

returnT;

}

BTREELchild(BTREEBT)

{

returnBT->lchild;

}

BTREERchild(BTREEBT)

{

returnBT->rchild;

}

intleafnum(BTREET)

{

if(T==NULL)

return0;

else

return1+leafnum(T->lchild)+leafnum(T->rchild);

}

voidmian()

{

BTREET,T1;

T=CreateBT('f',NULL,NULL);

T=CreateBT('d',NULL,NULL);

T1=CreateBT('e',NULL,NULL);

T=CreateBT('b',T,T1);

T1=CreateBT('c',NULL,NULL);

T=CreateBT('a',T,T1);

PreOrder(T);cout<

InOrder(T);cout<

PostOrder(T);cout<

NInOrder(T);cout<

}

十二、画出下图所表示的二叉树的中序线索二叉树和先序线索二叉树。

十三、已知二叉树的先根序列是AEFBGCDHIKJ,中根序列是EFAGBCHKIJD,画出此二叉树,并画出后序线索二叉树。

十四、在中序线索二叉树中插入一个结点Q作为树中某个结点P的左孩子,试给出相应的算法。

要求:

1、定义中序线索二叉树的型THTREE以及基本操作。

2、定义函数voidLInsert(THTREEP,THTREEQ);实现题目要求的操作。

在主函数中,利用操作RInsert和LInsert构造一个线索二叉树,并中序输出二叉树的结点的元素,验证结果。

#include

usingnamespacestd;

structnode{

datatypedata;

node*lchild,*rchild;

BOOLEANltag,rtag;

};

typenode*THTREE;

THTREEInNext(THTREEp)

{

THTREEQ=p->rchild;

if(p->rtag==TRUE)

while(Q->ltag==TRUE)

Q=Q->lchild;

returnQ;

}

THTREEInPre(THTREEp)

{

THTREEQ;

Q=p->lchild;

if(p->ltag==TRUE)

while(Q->rtag==TRUE)

Q=Q->rchild;

returnQ;

}

THTREEPreNext(THTREEp)

{

THTREEQ;

if(p->ltag==TRUE)

Q=p->lchild;

else{

Q=p;

while(Q->rtag==FALSE)

Q=Q->rchild;

Q=Q->rchild;

}

returnQ;

}

voidLInsert(THTREES,THTREER)

{

THTREEw;

R->lchild=S->lchild;

R->ltag=S->ltag;

R->rchild=S;

R->rtag=FALSE;

S->lchild=R;

S->ltag=TRUE;

if(Q->ltag==TRUE)

{

w=InPre(R);

w->rchild=R;

}

}

voidmian()

{

THTREEH=NULL,S=NULL,R=NULL;

reate_a_node(H,'');

H->rtag=TRUE;

H->ltag=FALSE;

H->lchild=H;

H->rchild=H;

create_a_node(S,'a');

LInsert(H,S);

create_a_node(R,'c');

RInsert(S,R);

create_a_node(R,'b');

LInsert(S,R);

create_a_node(S,'d');

LInsert(R,S);

create_a_node(S,'e');

RInsert(R,S);

create_a_node(R,'f');

RInsert(S,R);

ThInOrder(H);

cout<

system("pause");

return0;

}

要求:

1、上述作业要求在单独完成;

2、完成后,于规定期限内提交到教学辅助系统中,注意,在提交时将所编写的程序统一拷贝到一个Word文件中。

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

当前位置:首页 > 总结汇报 > 工作总结汇报

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

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