数据结构与算法3Word下载.docx
- 文档编号:21593358
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:17
- 大小:105.32KB
数据结构与算法3Word下载.docx
《数据结构与算法3Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构与算法3Word下载.docx(17页珍藏版)》请在冰豆网上搜索。
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<
i++)
{
输入第"
<
i+1<
个元素的行、列及元素值:
array[i][0]>
array[i][1]>
array[i][2];
}
num-1;
for(intj=i+1;
j<
j++)
if(array[i][0]>
array[j][0]||(array[i][0]==array[j][0]&
&
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;
}
三元组内数据为:
endl;
行号"
'
\t'
列号"
元素值"
array[i][0]<
array[i][1]<
array[i][2]<
intsum=0;
if(array[i][0]==array[i][1])sum+=array[i][2];
对角线元素和为:
sum<
system("
pause"
);
return0;
}
四、当具有相同行值和列值的稀疏矩阵A和B均以三元组顺序表方式存储时,试写出矩阵相加的算法,其结果存放在以行逻辑链接顺序表方式存储的矩阵C中。
intarray1[Maxlength][3],intarray2[Maxlength][3];
intarray[Maxlength][Maxlength];
输入第一个数组元素总个数:
intnum1;
num1;
intMaxn=0;
intMaxm=0;
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];
输入第二个数组元素总个数:
intnum2;
num2;
array2[i][0]>
array2[i][1]>
array2[i][2];
if(array2[i][0]>
if(array2[i][1]>
Maxm)Maxm=array2[i][1];
=Maxn;
for(intj=0;
=Maxm;
j++)array[i][j]=0;
i++)array[array1[i][0]][array1[i][1]]+=array1[i][2];
i++)array[array2[i][0]][array2[i][1]]+=array2[i][2];
合并后的矩阵行、列分别为:
Maxn<
Maxm<
合并后的矩阵元素为:
j++)cout<
array[i][j]<
五、设有一个稀疏矩阵:
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<
iostream>
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)
tag==FALSE)
element.data==T->
element.data)
x=TRUE;
else
x=FALSE;
x=Equal(S->
element.dlink,T->
element.dlink);
if(x==TRUE)
y=Equal(S->
link,T->
link);
returny;
intelements(listpointerL)
if(L==NULL)
if(L->
tag==0)
return(elements(L->
next)+1);
next)+elements(L->
val.sublist));
八、试分别画出具有4个结点的二叉树的所有不同形态。
9、已知一棵二叉树的中根序列和后根序列分别是BDCEAHFG和DECBHGFA,请画出此二叉树。
十、已知非空二叉树T,写一个算法,求度为2的结点的个数。
1、定义二叉树的抽象数据类型和型BTREE,并定义基本操作。
2、编写函数count2(BTREET),返回度为2的节点的个数。
3、在主函数中,构建一个二叉树,并验证所编写的算法。
structnode{
node*lchild;
node*rchild;
typedefnode*BTREE;
voidcreatebtree(BTREE&
root)
{
charch;
cin>
ch;
if(ch=='
*'
)
{
root=NULL;
return;
root=newnode;
root->
data=ch;
lchild=NULL;
rchild=NULL;
createbtree(root->
lchild);
rchild);
intcount2(BTREE&
r)
intcount=0;
if(r==NULL)
return0;
if((r->
lchild)&
(r->
rchild))
count=1;
returncount+count2(r->
lchild)+count2(r->
voidmain()
BTREEroot;
createbtree(root);
cout<
count2(root)<
endl;
十一、用递归方法写一个算法,求二叉树的叶子结点数intleafnum(BTREET)。
1、定义二叉树的抽象数据类型和型BTREE,并定义基本操作。
2、编写函数leafnum(BTREET),返回树T的叶子节点的个数。
在主函数中,构建一个二叉树,并验证所编写的算法。
structnode*lchild;
structnode*rchild;
datatypedata;
typedefstructnode*BTREE;
datatypeData(BTREEBT)
returnBT->
data;
BTREECreateBT(datatypev,BTREEltree,BTREErtree)
data=v;
lchild=ltree;
rchild=rtree;
returnroot;
BTREECreateBtree(BTREE&
T,char*&
str)
ch=*str++;
if(ch=='
#'
)t=NULL;
else{
if(!
(T=newnode))
exit
(1);
T->
CreateBtree(T->
lchild,str);
CreateBtree(t->
rchild,str);
returnT;
BTREELchild(BTREEBT)
lchild;
BTREERchild(BTREEBT)
rchild;
intleafnum(BTREET)
if(T==NULL)
return1+leafnum(T->
lchild)+leafnum(T->
voidmian()
BTREET,T1;
T=CreateBT('
f'
NULL,NULL);
d'
T1=CreateBT('
e'
b'
T,T1);
c'
a'
PreOrder(T);
cout<
InOrder(T);
PostOrder(T);
NInOrder(T);
十二、画出下图所表示的二叉树的中序线索二叉树和先序线索二叉树。
十三、已知二叉树的先根序列是AEFBGCDHIKJ,中根序列是EFAGBCHKIJD,画出此二叉树,并画出后序线索二叉树。
十四、在中序线索二叉树中插入一个结点Q作为树中某个结点P的左孩子,试给出相应的算法。
1、定义中序线索二叉树的型THTREE以及基本操作。
2、定义函数voidLInsert(THTREEP,THTREEQ);
实现题目要求的操作。
在主函数中,利用操作RInsert和LInsert构造一个线索二叉树,并中序输出二叉树的结点的元素,验证结果。
node*lchild,*rchild;
BOOLEANltag,rtag;
typenode*THTREE;
THTREEInNext(THTREEp)
THTREEQ=p->
if(p->
rtag==TRUE)
while(Q->
ltag==TRUE)
Q=Q->
returnQ;
THTREEInPre(THTREEp)
THTREEQ;
Q=p->
THTREEPreNext(THTREEp)
Q=p;
rtag==FALSE)
voidLInsert(THTREES,THTREER)
THTREEw;
R->
lchild=S->
ltag=S->
ltag;
rchild=S;
rtag=FALSE;
S->
lchild=R;
ltag=TRUE;
if(Q->
w=InPre(R);
w->
rchild=R;
THTREEH=NULL,S=NULL,R=NULL;
reate_a_node(H,'
'
H->
rtag=TRUE;
ltag=FALSE;
lchild=H;
rchild=H;
create_a_node(S,'
LInsert(H,S);
create_a_node(R,'
RInsert(S,R);
LInsert(S,R);
LInsert(R,S);
RInsert(R,S);
ThInOrder(H);
1、上述作业要求在单独完成;
2、完成后,于规定期限内提交到教学辅助系统中,注意,在提交时将所编写的程序统一拷贝到一个Word文件中。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 算法