题1:用单链表来存储集合,并假设这样的单链表中的节点递增有序,设计一个尽可能高效的算法求两个集合A和B的并集C。设A、B中分别有m和n个元素
由于单链表是递增有序的,可以采用归并算法提高求并集的效率,结果并集C采用尾插法建表。
void Unionset(LinkList *A,LinkList *B,LinkList *&C)
{ LinkList *pa=A->next,*pb=B->next,*s,*r;
C=(LinkList *)malloc(sizeof(LinkList)); //建立C的头节点
r=C; //r始终指向单链表C的尾节点
while (pa!=NULL && pb!=NULL)
{ if (pa->data<pb->data) //仅复制*pa节点
{ s=(LinkList *)malloc(sizeof(LinkList));
s->data=pa->data;
r->next=s; r=s;
pa=pa->next;
}
else if (pa->data>pb->data) //仅复制*pb节点
{ s=(LinkList *)malloc(sizeof(LinkList));
s->data=pb->data;
r->next=s; r=s;
pb=pb->next;
}
else
{ s=(LinkList *)malloc(sizeof(LinkList));
s->data=pa->data;
r->next=s; r=s;
pa=pa->next;
pb=pb->next;
}
}
while (pa!=NULL) //复制A单链表的余下节点
{ s=(LinkList *)malloc(sizeof(LinkList));
s->data=pa->data;
r->next=s; r=s;
pa=pa->next;
}
while (pb!=NULL) //复制B单链表的余下节点
{ s=(LinkList *)malloc(sizeof(LinkList));
s->data=pb->data;
r->next=s; r=s;
pb=pb->next;
}
r->next=NULL;
}
题2:假设二叉树采用二叉链存储结构进行存储,假设每个节点值为单个字符且所有节点值不同,设计一个算法,输出二叉树b中第k的所有节点值
该题用的是先序遍历
void Dispk(BTNode *b,int k)
{
Dispk1(b,k,1);
}
void Dispk1(BTNode *b,int k,int h)
{
if (b!=NULL)
{
if (h==k) printf(“%c “,b->data);
Dispk1(b->lchild,k,h+1);
Dispk1(b->rchild,k,h+1);
}
}