题1:设A和B是两个结点个数分别为m和n的单链表(带头结点),其中元素递增有序。
设计一个尽可能高效的算法求A和B的交集,要求不破坏A、B的结点,将交集存放在单链表C中
void insertion(LinkList *A,LinkList *B,LinkList *&C)
{ LinkList *p=A->next,*q=B->next,*s,*t;
C=(LinkList *)malloc(sizeof(LinkList));
t=C;
while (p!=NULL && q!=NULL)
{ if (p->data==q->data)
{ s=(LinkList *)malloc(sizeof(LinkList));
s->data=p->data;
t->next=s;
t=s;
p=p->next;
q=q->next;
}
else if (p->data<q->data)
p=p->next;
else
q=q->next;
}
t->next=NULL;
}
算法的时间复杂度为O(m+n),空间复杂度为O(MIN(m,n))
题2:
假设二叉树b采用二叉链存储结构,设计一个算法void findparent(BTNode *b,ElemType x,BTNode *&p)求指定值为x的结点的双亲结点p,提示,根结点的双亲为NULL,若未找到这样的结点,p亦为NULL。
void findparent(BTNode *b,ElemType x,BTNode *&p)
{ if (b!=NULL)
{ if (b->data==x) p=NULL;
else if (b->lchild!=NULL && b->lchild->data==x)
p=b;
else if (b->rchild!=NULL && b->rchild->data==x)
p=b;
else
{ findparent(b->lchild,x,p);
if (p==NULL)
findparent(b->rchild,x,p);
}
}
else p=NULL;
}