数据结构与算法3.docx
- 文档编号:8457123
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:17
- 大小:105.32KB
数据结构与算法3.docx
《数据结构与算法3.docx》由会员分享,可在线阅读,更多相关《数据结构与算法3.docx(17页珍藏版)》请在冰豆网上搜索。
数据结构与算法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文件中。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 算法