2011福建省数据简介基础

发布时间:   来源:文档文库   
字号:
1(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
2、证明由二叉树的中序序列和后序序列,也可以唯一确定一棵二叉树。n=1时,只有一个根结点,由中序序列和后序序列可以确定这棵二叉树。设当n=m-1时结论成立,现证明当n=m时结论成立。设中序序列为S1S2„,Sm,后序序列是P1,P2,„,Pm因后序序列最后一个元素Pm是根,则在中序序列中可找到与Pm相等的结点(设二叉树中各结点互不相同)Si(1im,因中序序列是由中序遍历而得,所以Si是根结点,S1S2,„,Si-1是左子树的中序序列,而Si+1,Si+2,,Sm是右子树的中序序列。
i=1,则S1是根,这时二叉树的左子树为空,右子树的结点数是m-1,{S2S3,„,Sm}{P1P2,„,Pm-1}可以唯一确定右子树,从而也确定了二叉树。i=m,Sm是根,这时二叉树的右子树为空,左子树的结点数是m-1{S1S2„,Sm-1}{P1P2,„,Pm-1}唯一确定左子树,从而也确定了二叉树。
最后,当1时,Si把中序序列分成{S1S2,„,Si-1}{Si+1,Si+2,„,Sm}。由于后序遍历是“左子树—右子树—根结点”,所以{P1,P2,,Pi-1}{Pi,Pi+1,Pm-1}是二叉树的左子树和右子树的后序遍历序列。因而由{S1S2,„,Si-1}{P1P2,„,Pi-1}可唯一确定二叉树的左子树,由{Si+1,Si+2,„,Sm}{Pi,Pi+1,„,Pm-1}可唯一确定二叉树的右子树。
3二叉树的层次遍历序列的第一个结点是二叉树的根。实际上,层次遍历序列中的每个结点都是“局部根”。确定根后,到二叉树的中序序列中,查到该结点,该结点将二叉树分为“左根右”三部分。若左、右子树均有,则层次序列根结点的后面应是左右子树的根;若中序序列中只有左子树或只有右子树,则在层次序列的根结点后也只有左子树的根或右子树的根。这样,定义一个全局变量指针R,指向层次序列待处理元素。算法中先处理根结点,将根结点和左右子女的信息入队列。然后,在队列不空的条件下,循环处理二叉树的结点。队列中元素的数据结构定义如下:typedefstruct
{intlvl;//层次序列指针,总是指向当前“根结点”在层次序列中的位置intl,h;//中序序列的下上界
intf;//层次序列中当前“根结点”的双亲结点的指针intlr;//1—双亲的左子树2—双亲的右子树}qnode;
BiTreeCreat(datatypein[],level[],intn
//由二叉树的层次序列level[n]和中序序列in[n]生成二叉树。n是二叉树的结点数{if(n<1{printf(“参数错误\n;exit(0;}
qnodes,Q[];//Q是元素为qnode类型的队列,容量足够大init(Q;intR=0;//R是层次序列指针,指向当前待处理的结点BiTreep=(BiTreemalloc(sizeof(BiNode;//生成根结点

p->data=level[0];p->lchild=null;p->rchild=null;//填写该结点数据
for(i=0;i在中序序列中查找根结点,然后,左右子女信息入队列if(in[i]==level[0]break;
if(i==0//根结点无左子树,遍历序列的1n-1是右子树{p->lchild=null;
s.lvl=++R;s.l=i+1;s.h=n-1;s.f=p;s.lr=2;enqueue(Q,s;}
elseif(i==n-1//根结点无右子树,遍历序列的1n-1是左子树{p->rchild=null;
s.lvl=++R;s.l=1;s.h=i-1;s.f=p;s.lr=1;enqueue(Q,s;}
else//根结点有左子树和右子树
{s.lvl=++R;s.l=0;s.h=i-1;s.f=p;s.lr=1;enqueue(Q,s;//左子树有关信息入队列s.lvl=++R;s.l=i+1;s.h=n-1;s.f=p;s.lr=2;enqueue(Q,s;//右子树有关信息入队列}
while(!empty(Q//当队列不空,进行循环,构造二叉树的左右子树{s=delqueue(Q;father=s.f;for(i=s.l;i<=s.h;i++
if(in[i]==level[s.lvl]break;
p=(bitreptrmalloc(sizeof(binode;//申请结点空间
p->data=level[s.lvl];p->lchild=null;p->rchild=null;//填写该结点数据if(s.lr==1father->lchild=p;
elsefather->rchild=p//让双亲的子女指针指向该结点if(i==s.l
{p->lchild=null;//处理无左子女
s.lvl=++R;s.l=i+1;s.f=p;s.lr=2;enqueue(Q,s;}
elseif(i==s.h
{p->rchild=null;//处理无右子女
s.lvl=++R;s.h=i-1;s.f=p;s.lr=1;enqueue(Q,s;}
else{s.lvl=++R;s.h=i-1;s.f=p;s.lr=1;enqueue(Q,s;//左子树有关信息入队
s.lvl=++R;s.l=i+1;s.f=p;s.lr=2;enqueue(Q,s;//右子树有关信息入队列}
}//结束while(!empty(Qreturn(p;}//算法结束4由二叉树的前序遍历和中序遍历序列能确定唯一的一棵二叉树,下面程序的作用是实现由已知某二叉树的前序遍历和中序遍历序列,生成一棵用二叉链表表示的二叉树并打印出后序遍历序列,请写出程序所缺的语句。#defineMAX100typedefstructNode

{charinfo;structNode*llink,*rlink;}TNODE;charpred[MAX],inod[MAX];main(intargc,int**argv{TNODE*root;if(argc<3exit0;
strcpy(pred,argv[1];strcpy(inod,argv[2];root=restore(pred,inod,strlen(pred;postorder(root;}
TNODE*restore(char*ppos,char*ipos,intn{TNODE*ptrchar*rpos;intk;if(n<=0returnNULL;ptr->info=(1_______;
for((2_______;rposk=(3_______;
ptr->llink=restore(ppos+1,(4_______,k;
ptr->rlink=restore((5_______+k,rpos+1,n-1-k;returnptr;}
postorder(TNODE*ptr{if(ptr=NULLreturn;
postorder(ptr->llink;postorder(ptr->rlink;printf(%c,ptr->info;}5t是给定的一棵二叉树,下面的递归程序count(t用于求得:二叉树t中具有非空的左,右两个儿子的结点个数N2;只有非空左儿子的个数NL;只有非空右儿子的结点个数NR和叶子结点个数N0N2NLNRN0都是全局量,且在调用count(t之前都置为0.typedefstructnode
{intdata;structnode*lchild,*rchild;}node;intN2,NL,NR,N0;voidcount(node*t
{if(t->lchild!=NULLif(1___N2++;elseNL++;elseif(2___NR++;else(3__;
if(t->lchild!=NULL(4____;if(t->rchild!=NULL(5____;}
26.树的先序非递归算法。voidexample(bbtree*b;
{btree*stack[20],*pinttop;if(b!=null
{top=1;stack[top]=b;while(top>0
{p=stack[top];top--;

printf(%d,p->data;if(p->rchild!=null{(1___;(2___;}
if(p->lchild!=null(3___;(4__;}}}}
6、矩阵中元素按行和按列都已排序,要求查找时间复杂度为Om+n,因此不能采用常规的二层循环的查找。可以先从右上角i=a,j=d元素与x比较,只有三种情况:一是A[i,j]>x这情况下向j小的方向继续查找;二是A[i,j]下步应向i大的方向查找;三是A[i,j]=x查找成功。否则,若下标已超出范围,则查找失败。
voidsearch(datatypeA[][],inta,b,c,d,datatypex
//n*m矩阵A,行下标从ab,列下标从cd,本算法查找x是否在矩阵A.{i=a;j=d;flag=0;//flag是成功查到x的标志while(i<=b&&j>=c
if(A[i][j]==x{flag=1;break;}elseif(A[i][j]>xj--;elsei++;
if(flagprintf(A[%d][%d]=%d,i,j,x;//假定x为整型.elseprintf(“矩阵A中无%d元素”x}算法search结束。
[算法讨论]算法中查找x的路线从右上角开始,向下(当x>A[i,j]或向左(当x向下最多是m向左最多是n最佳情况是在右上角比较一次成功,最差是在左下角A[b,c]比较m+n次,故算法最差时间复杂度是O(m+n
7给定n个村庄之间的交通图,若村庄ij之间有道路,则将顶点ij用边连接,边上Wij表示这条道路的长度,现在要从这n个村庄中选择一个村庄建一所医院,问这所医院应建在哪个村庄,才能使离医院最远的村庄到医院的路程最短?试设计一个解答上述问题的算法,并应用该算法解答如图所示的实例。20分)
8假设以IO分别表示入栈和出栈操作。栈的初态和终态均为空,入栈和出栈的操作序列可表示为仅由IO组成的序列,称可以操作的序列为合法序列,否则称为非法序列。15分)
1)下面所示的序列中哪些是合法的?
A.IOIIOIOOB.IOOIOIIOC.IIIOIOIOD.IIIOOIOO2通过对1的分析,写出一个算法,判定所给的操作序列是否合法。若合法,返回true否则返回false(假定被判定的操作序列已存入一维数组中)
9、编程实现单链表的就地逆置。
23.在数组A[1..n]中有n个数据,试建立一个带有头结点的循环链表,头指针为h,要求链中数据从小到大排列,重复的数据在链中只保存一个.
10冒泡排序算法是把大的元素向上移(气泡的上浮)也可以把小的元素向下移(气泡的下沉)请给出上浮和下沉过程交替的冒泡排序算法。
48.n个记录存储在带头结点的双向链表中,现用双向起泡排序法对其按上升序进行排序,

请写出这种排序的算法。(注:双向起泡排序即相邻两趟排序向相反方向起泡)
11、给出折半查找的递归算法,并给出算法时间复杂度性分析。
12、设有一个数组中存放了一个无序的关键序列K1K2、„、Kn。现要求将Kn放在将元素排序后的正确位置上,试编写实现该功能的算法,要求比较关键字的次数不超过n
51.借助于快速排序的算法思想,在一组无序的记录中查找给定关键字值等于key的记录。设此组记录存放于数组r[l..h]中。若查找成功,则输出该记录在r数组中的位置及其值,否则显示“notfind”信息。请编写出算法并简要说明算法思想。
13、根据二叉排序树中序遍历所得结点值为增序的性质,在遍历中将当前遍历结点与其前驱结点值比较,即可得出结论,为此设全局指针变量pre(初值为null)和全局变量flag,初值为true。若非二叉排序树,则置flagfalse#definetrue1#definefalse0typedefstructnode
{datatypedata;structnode*llink,*rlink;}*BTree;voidJudgeBSTBTreet,intflag
//判断二叉树是否是二叉排序树,本算法结束后,在调用程序中由flag得出结论。{ift!=null&&flag
{Judgebstt->llink,flag//中序遍历左子树
ifpre==nullpre=t//中序遍历的第一个结点不必判断
elseifpre->datadatapre=t//前驱指针指向当前结点else{flag=flase}//不是完全二叉树Judgebstt->rlink,flag//中序遍历右子树}//JudgeBST算法结束
14、设一棵二叉树的结点结构为(LLINK,INFO,RLINK,ROOT为指向该二叉树根结点的指针,pq分别为指向该二叉树中任意两个结点的指针,试编写一算法ANCESTORROOTp,q,r,该算法找到pq的最近共同祖先结点r
15、假设以IO分别表示入栈和出栈操作。栈的初态和终态均为空,入栈和出栈的操作序列可表示为仅由IO组成的序列,称可以操作的序列为合法序列,否则称为非法序列。15分)
1)下面所示的序列中哪些是合法的?
A.IOIIOIOOB.IOOIOIIOC.IIIOIOIOD.IIIOOIOO2通过对1的分析,写出一个算法,判定所给的操作序列是否合法。若合法,返回true否则返回false(假定被判定的操作序列已存入一维数组中)

本文来源:https://www.2haoxitong.net/k/doc/ec0007beff00bed5b8f31d7a.html

《2011福建省数据简介基础.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式