2015年内蒙古自治区数据结构理论与实践深入

发布时间:

1设一棵二叉树的结点结构为(LLINK,INFO,RLINK,ROOT为指向该二叉树根结点的指针,pq分别为指向该二叉树中任意两个结点的指针,试编写一算法ANCESTORROOTp,q,r,该算法找到pq的最近共同祖先结点r
2数组AB的元素分别有序,欲将两数组合并到C数组,使C仍有序,应将AB拷贝到C只要注意AB数组指针的使用,以及正确处理一数组读完数据后将另一数组余下元素复制到C中即可。
voidunion(intA[],B[],C[],m,n
//整型数组AB各有mn个元素,前者递增有序,后者递减有序,本算法将AB归并为递增有序的数组C
{i=0;j=n-1;k=0;//ijk分别是数组A,BC的下标,因用C描述,下标从0开始while(i=0
if(a[i]while(iwhile(j>=0c[k++]=b[j--];}算法结束
4、要求二叉树按二叉链表形式存储。151)写一个建立二叉树的算法。2)写一个判别给定的二叉树是否是完全二叉树的算法。BiTreeCreat(//建立二叉树的二叉链表形式的存储结构{ElemTypexBiTreebt;
scanf(%d,&x;//本题假定结点数据域为整型if(x==0bt=null;elseif(x>0
{bt=(BiNode*malloc(sizeof(BiNode;
bt->data=x;bt->lchild=creat(;bt->rchild=creat(;}
elseerror(“输入错误”return(bt;}//结束BiTree
intJudgeComplete(BiTreebt//判断二叉树是否是完全二叉树,如是,返回1,否则,返0
{inttag=0;BiTreep=bt,Q[];//Q是队列,元素是二叉树结点指针,容量足够大if(p==nullreturn(1;
QueueInit(Q;QueueIn(Q,p;//初始化队列,根结点指针入队while(!QueueEmpty(Q
{p=QueueOut(Q;//出队
if(p->lchild&&!tagQueueIn(Q,p->lchild;//左子女入队
else{if(p->lchildreturn0;//前边已有结点为空,本结点不空elsetag=1;//首次出现结点为空if(p->rchild&&!tagQueueIn(Q,p->rchild;//右子女入队elseif(p->rchildreturn0;elsetag=1;}//while
return1;}//JudgeComplete
3、我们用l代表最长平台的长度,用k指示最长平台在数组b中的起始位置(下标)。用j

记住局部平台的起始位置,i指示扫描b数组的下标,i0开始,依次和后续元素比较,若局部平台长度(i-j)大于l时,则修改最长平台的长度kl=i-j)和其在b中的起始位置(k=j,直到b数组结束,l即为所求。voidPlatform(intb[],intN
//求具有N个元素的整型数组b中最长平台的长度。{l=1;k=0;j=0;i=0;while(i
{while(i
if(i-j+1>l{l=i-j+1;k=j;}//局部最长平台i++;j=i;}//新平台起点
printf(“最长平台长度%d,在b数组中起始下标为%dlk}//Platform
44voidLinkList_reverse(Linklist&L
//链表的就地逆置;为简化算法,假设表长大于2{
p=L->next;q=p->next;s=q->next;p->next=NULL;while(s->next{
q->next=p;p=q;
q=s;s=s->next;//L的元素逐个插入新表表头}
q->next=p;s->next=q;L->next=s;}//LinkList_reverse
5(1p->rchild(2p->lchild(3p->lchild(4ADDQ(Q,p->lchild(5ADDQ(Q,p->rchild
25.(1t->rchild!=null(2t->rchild!=null(3N0++(4count(t->lchild(5count(t->rchild
26..(1top++(2stack[top]=p->rchild(3top++(4stack[top]=p->lchild
27.(1*ppos//根结点2rpos=ipos(3rposipos(4ipos(5ppos+1
6、设有两个集合A和集合B,要求设计生成集合C=AB的算法,其中集合ABC用链式存储结构表示。
typedefstructnode{intdata;structnode*next;}lklist;voidintersection(lklist*ha,lklist*hb,lklist*&hc{
lklist*p,*q,*t;
for(p=ha,hc=0;p!=0;p=p->next
{for(q=hb;q!=0;q=q->nextif(q->data==p->databreak;
if(q!=0{t=(lklist*malloc(sizeof(lklist;t->data=p->data;t->next=hc;hc=t;}}}


7、对二叉树的某层上的结点进行运算,采用队列结构按层次遍历最适宜。
intLeafKlevel(BiTreebt,intk//求二叉树bt的第k(k>1层上叶子结点个数{if(bt==null||k<1return(0;
BiTreep=bt,Q[];//Q是队列,元素是二叉树结点指针,容量足够大
intfront=0,rear=1,leaf=0;//frontrear是队头和队尾指针,leaf是叶子结点数intlast=1,level=1;Q[1]=p;//last是二叉树同层最右结点的指针,level是二叉树的层
while(front<=rear{p=Q[++front];
if(level==k&&!p->lchild&&!p->rchildleaf++;//叶子结点if(p->lchildQ[++rear]=p->lchild;//左子女入队if(p->rchildQ[++rear]=p->rchild;//右子女入队
if(front==last{level++;//二叉树同层最右结点已处理,层数增1last=rear;}//last移到指向下层最右一元素if(level>kreturn(leaf;//层数大于k后退出运行}//while}//结束LeafKLevel

2015年内蒙古自治区数据结构理论与实践深入

相关推荐