数据结构与算法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;ifor(intj=i+1;jif(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;icout<intsum=0;
for(inti=0;iif(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;ifor(inti=0;icout<<"合并后的矩阵行、列分别为:
"<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文件中。