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->next=s;
s->next=q;
}
13.有一带表头结点的单链表,其结点的元素值以非递减有序排列,编写一个算法在该链表中插入一个元素x,使得插入后的单链表仍有序。
【答案】
voidalgo1(LNode*H,ElemTpx)
{
s=(LNode*)malloc(sizeof(LNode));
s->data=x;
q=H;p=H->next;
while(p&&p->data<=x)
{
q=p;p=p->next;
}
s->next=p;q->next=s;
}
14.二叉排序树的类型定义如下:
typedefstructBSTNode{∥二叉排序树的结点结构
intdata;∥数据域
structBSTNode*lchild,*rchild;∥左、右孩子指针
}BSTNode,*BSTree;
设计递归算法,统计一棵二叉排序树T中值小于a的结点个数。
【答案】
intf34(BSTreeroot)
{
intcount;
BSTNode*p;
p=root;
if(p&&p->dataf34(p->lchild);
returncount;
}
15.有一带表头结点的单链表,其结点的data域的类型为字符型,编写一个算法删除该链表中的数字字符。
【答案】
voidDel_digit(LNode*h){
for(p=h;p->next;){
q=p->next;
if(q->data>=’0’&&q->data<=’9’)
{p->next=q->next;free(q);}
elsep=q;
}
}
16.利用栈的基本运算,编写一个算法,实现将整数转换成二进制数输出。
【答案】
voidreturnDtoO(intnum)
{
ini