f34(p->lchild);
returncount;
}
5.设二叉树T采用二叉链表结构存储,试设计算法求出二叉树中离根最近的第一个叶子结点。
(注:
结点按从上往下,自左
至右次序编号)
【答案】
BTNode*Firstleaf(BTNode*bt)
{InitQueue(Q);//初始化队列Q
if(bt){
EnQueue(Q,bt);;
while(!
EmptyQueue(Q)){
DeQueue(Q,p);
if(!
p->lchild&&!
p->rchild)returnp;
if(p->lchild)EnQueue(Q,p->lchild);
if(p->rchild)EnQueue(Q,p->rchild);
}
}
}
6.已知一棵具有n个结点的完全二叉树被顺序存储在一维数组中,结点为字符类型,编写算法打印出编号为k的结点的双亲和孩子结点。
【答案】
intalgo2(charbt[],intn,intk){
if(k<1||k>n)return0;
if(k==1)printf(“%cisaroot\n”,bt[1]);
elseprintf(“%c’sparentis%c\n”,bt[k],bt[k/2]);
if(2*k<=n)printf(“%c’slchildis%c\n”,bt[k],bt[2*k]);
elseprintf(“%cisnotlchild\n”,bt[k]));
if(2*k+1<=n)printf(“%c’srchildis%c\n”,bt[k],bt[2*k+1]);
elseprintf(“%cisnotrchild\n”,bt[k]));
return1;
}
7.编写算法,将非空单链表hb插入到单链表ha的第i(0
【答案】
intalgo1(LNode*ha,LNode*hb,inti){
for(p=hb;p->next;p=p->next);
for(j=1,q=ha;jnext;
p->next=q->next;
q->next=hb->next;
free(hb);
}
8.设二叉树T已按完全二叉树的形式存储在顺序表T中,试设计算法根据顺序表T建立该二叉树的二叉链表结构。
顺序表T定义如下:
structtree{
intno;/*结点按完全二叉树的编号*/
ElEMTPdata;/*数据域*/
}T[N];/*N为二叉树T的结点数*/
【答案】
BTNode*creat_tree(structtreeT[N])
{BTNode*p[MAX];
t=NULL;
for(i=0;is=(BTNode*)malloc(sizeof(BTNode));
s->data=T[i].data;
s->lchild=s->rchild=NULL;
m=T[i].no;p[m]=s;
if(m==1)t=s;
else{j=m/2;
if(m%2==0)p[j]->lchild=s;
elsep[j]->rchild=s;
}//slse
}//for
returnt;
}//creat_tree
9.编写算法判断带表头结点的单链表L是否是递增的。
若递增返回1,否则返回0。
【答案】
intalgo1(LNode*L)
{
if(!
L->next)return1;
p=L->next;
while(p->next){
if(p->datanext->data)p=p->next;
elsereturn0;
}
return1;
}
10.假设一线性表由Fibonacci数列的前n(n≥3)项构成,试以带表头结点的单链表作该线性表的存储结构,设计算法建立该单链表,且将项数n存储在表头结点中。
Fibonacci数列根据下式求得:
1(n=1)
f(n)=1(n=2)
f(n-2)+f(n-1)(n≥3)
【答案】
LNode*Creatlist(LNode*h,intn){
h=(LNode*)malloc(sizeof(Lnode));
h->data=n;
h->next=p=(LNode*)malloc(sizeof(Lnode));
p->next=q=(LNode*)malloc(sizeof(Lnode));
p->data=q->data=1;
for(i=3;i<=n;i++){
q->next=s=(LNode*)malloc(sizeof(Lnode));
s->data=p->data+q->data;s->next=NULL;
p=q;q=s;
}
returnh;
}
11.设二叉树T采用二叉链表结构存储,数据元素为字符类型。
设计算法将二叉链表中所有data域为小写字母的结点改为大写
字母。
【答案】
voidalgo2(BTNode*bt){
if(bt){
if(bt->data>=’a’&&bt->data<=’z’)
bt->data-=32;
algo2(bt->lchild);
algo2(bt->rchild);
}
}
12.假设线性表以带表头结点的循环单链表表示。
试设计一个算法,在线性表的第k个元素前插入新元素y。
假如表长小于k,则插在表尾。
【答案】
voidInsertlist(LNode*h,intk,ElemTypey)
{
q=h;P=h->next;j=1;
while(p!
=h&&jq=p;p=p->next;j++;
}
s=(LNode*)malloc(sizeof(Lnode));
s->data=y;
q-