2010河北省数据要领入门

发布时间:   来源:文档文库   
字号:
1设一棵二叉树的结点结构为(LLINK,INFO,RLINK,ROOT为指向该二叉树根结点的指针,pq分别为指向该二叉树中任意两个结点的指针,试编写一算法ANCESTORROOTp,q,r,该算法找到pq的最近共同祖先结点r
2两棵空二叉树或仅有根结点的二叉树相似;对非空二叉树,可判左右子树是否相似,采用递归算法。
intSimilar(BiTreep,q//判断二叉树pq是否相似{if(p==null&&q==nullreturn(1;elseif(!p&&q||p&&!qreturn(0;
elsereturn(Similar(p->lchild,q->lchild&&Similar(p->rchild,q->rchild}//结束Similar
3、约瑟夫环问题(Josephus问题)是指编号为12、„,nnn>0)个人按顺时针方向围坐成一圈,现从第s个人开始按顺时针方向报数,数到第m个人出列,然后从出列的下一个人重新开始报数,数到第m的人又出列,„,如此重复直到所有的人全部出列为止。现要求采用循环链表结构设计一个算法,模拟此过程。
4、二路插入排序是将待排关键字序列r[1..n]中关键字分二路分别按序插入到辅助向量d[1..n]前半部和后半部(注:向量d可视为循环表),其原则为,先将r[l]赋给d[1],再从r[2]记录开始分二路插入。编写实现二路插入排序算法。
5设一棵二叉树的结点结构为(LLINK,INFO,RLINK,ROOT为指向该二叉树根结点的指针,pq分别为指向该二叉树中任意两个结点的指针,试编写一算法ANCESTORROOTp,q,r,该算法找到pq的最近共同祖先结点r
6、证明由二叉树的中序序列和后序序列,也可以唯一确定一棵二叉树。29.试找出满足下列条件的二叉树
1)先序序列与后序序列相同2)中序序列与后序序列相同
3)先序序列与中序序列相同4)中序序列与层次遍历序列相同
7、给出折半查找的递归算法,并给出算法时间复杂度性分析。
8、证明由二叉树的中序序列和后序序列,也可以唯一确定一棵二叉树。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}可唯一确定二叉树的右子树

9根据二叉排序树中序遍历所得结点值为增序的性质,在遍历中将当前遍历结点与其前驱结点值比较,即可得出结论,为此设全局指针变量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算法结束
10、假设以IO分别表示入栈和出栈操作。栈的初态和终态均为空,入栈和出栈的操作序列可表示为仅由IO组成的序列,称可以操作的序列为合法序列,否则称为非法序列。15分)
1AD是合法序列,BC是非法序列。2)设被判定的操作序列已存入一维数组A中。intJudge(charA[]
//判断字符数组A中的输入输出序列是否是合法序列。如是,返回true,否则返回false
{i=0;//i为下标。
j=k=0;//jk分别为I和字母O的的个数。while(A[i]!=\0//当未到字符数组尾就作。{switch(A[i]
{caseI:j++;break;//入栈次数增1
caseO:k++;if(k>j{printf(“序列非法\nexit(0;}}
i++;//不论A[i]是‘I’或‘O,指针i均后移。}
if(j!=k{printf(“序列非法\nreturn(false;}else{printf(“序列合法\nreturn(true;}}//算法结束。
11、后序遍历最后访问根结点,即在递归算法中,根是压在栈底的。采用后序非递归算法,栈中存放二叉树结点的指针,当访问到某结点时,栈中所有元素均为该结点的祖先。本题要pq的最近共同祖先结点r,不失一般性,设pq的左边。后序遍历必然先遍历到结p,栈中元素均为p的祖先。将栈拷入另一辅助栈中。再继续遍历到结点q时,将栈中元素从栈顶开始逐个到辅助栈中去匹配,第一个匹配(即相等)的元素就是结点pq的最近公共祖先。

typedefstruct
{BiTreet;inttag;//tag=0表示结点的左子女已被访问,tag=1表示结点的右子女已被访问}stack;
stacks[],s1[];//栈,容量够大
BiTreeAncestor(BiTreeROOT,p,q,r//求二叉树上结点pq的最近的共同祖先结点r{top=0;bt=ROOT;while(bt!=null||top>0
{while(bt!=null&&bt!=p&&bt!=q//结点入栈{s[++top].t=bt;s[top].tag=0;bt=bt->lchild;}//沿左分枝向下
if(bt==p//不失一般性,假定pq的左侧,遇结点p时,栈中元素均为p的祖先结点{for(i=1;i<=top;i++s1[i]=s[i];top1=top;}//将栈s的元素转入辅助栈s1保存if(bt==q//找到q结点。
for(i=top;i>0;i--//;将栈中元素的树结点到s1去匹配{pp=s[i].t;
for(j=top1;j>0;j--
if(s1[j].t==pp{printf(pq的最近共同的祖先已找到”return(pp;}
while(top!=0&&s[top].tag==1top--;//退栈
if(top!=0s[top].tag=1;bt=s[top].t->rchild;//沿右分枝向下遍历}//结束while(bt!=null||top>0return(null;//q、p无公共祖先//结束Ancestor
12、根据二叉排序树中序遍历所得结点值为增序的性质,在遍历中将当前遍历结点与其前驱结点值比较,即可得出结论,为此设全局指针变量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算法结束
13、本题应使用深度优先遍历,从主调函数进入dfs(v,开始记数,若退出dfs(前,已访问完有向图的全部顶点(设为n个),则有向图有根,v为根结点。将n个顶点从1n

号,各调用一次dfs(过程,就可以求出全部的根结点。题中有向图的邻接表存储结构、记顶点个数的变量、以及访问标记数组等均设计为全局变量。建立有向图g的邻接表存储结构参见上面第2题,这里只给出判断有向图是否有根的算法。
intnum=0visited[]=0//num记访问顶点个数,访问数组visited初始化。constn=用户定义的顶点数;
AdjListg;//用邻接表作存储结构的有向图gvoiddfs(v
{visited[v]=1;num++;//访问的顶点数+1
if(num==n{printf(%d是有向图的根。\n,v;num=0;}//ifp=g[v].firstarc;while(p
{if(visied[p->adjvex]==0dfs(p->adjvex;p=p->next;}//while
visited[v]=0;num--;//恢复顶点v}//dfs
voidJudgeRoot(
//判断有向图是否有根,有根则输出之。{staticinti;
for(i=1;i<=n;i++//从每个顶点出发,调用dfs(各一次。{num=0;visited[1..n]=0;dfs(i;}}//JudgeRoot
算法中打印根时,输出顶点在邻接表中的序号(下标),若要输出顶点信息,可使用g[i].vertex
14、在有向图G中,如果rG中的每个结点都有路径可达,则称结点rG的根结点。编写一个算法完成下列功能:1.建立有向图G的邻接表存储结构;2.判断有向图G是否有根,若有,则打印出所有根结点的值。
15、设一棵二叉树的结点结构为(LLINK,INFO,RLINK,ROOT为指向该二叉树根结点的指针,pq分别为指向该二叉树中任意两个结点的指针,试编写一算法ANCESTORROOTp,q,r,该算法找到pq的最近共同祖先结点r

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

《2010河北省数据要领入门.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式