收藏 分享(赏)

2015年台湾省数据库入门摘要.doc

上传人:HR专家 文档编号:11669790 上传时间:2020-11-04 格式:DOC 页数:4 大小:24.51KB
下载 相关 举报
2015年台湾省数据库入门摘要.doc_第1页
第1页 / 共4页
2015年台湾省数据库入门摘要.doc_第2页
第2页 / 共4页
2015年台湾省数据库入门摘要.doc_第3页
第3页 / 共4页
2015年台湾省数据库入门摘要.doc_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

1、1、假设K1,Kn是n个关键词,试解答:试用二叉查找树的插入算法建立一棵二叉查找树,即当关键词的插入次序为K1,K2,Kn时,用算法建立一棵以LLINK / RLINK 链接表示的二叉查找树。2、本题应使用深度优先遍历,从主调函数进入dfs(v)时 ,开始记数,若退出dfs()前,已访问完有向图的全部顶点(设为n个),则有向图有根,v为根结点。将n个顶点从1到n编号,各调用一次dfs()过程,就可以求出全部的根结点。题中有向图的邻接表存储结构、记顶点个数的变量、以及访问标记数组等均设计为全局变量。建立有向图g的邻接表存储结构参见上面第2题,这里只给出判断有向图是否有根的算法。 int num=

2、0, visited=0 /num记访问顶点个数,访问数组visited初始化。 const n=用户定义的顶点数; AdjList g ; /用邻接表作存储结构的有向图g。 void dfs(v) visited v=1; num+; /访问的顶点数1 if (num=n) printf(“%d是有向图的根。n”,v); num=0;/if p=gv.firstarc; while (p) if (visiedp-adjvex=0) dfs (p-adjvex);p=p-next; /while visitedv=0; num-; /恢复顶点v/dfsvoid JudgeRoot()/判断有

3、向图是否有根,有根则输出之。 static int i ;for (i=1;i=n;i+ ) /从每个顶点出发,调用dfs()各一次。 num=0; visited1.n=0; dfs(i); / JudgeRoot算法中打印根时,输出顶点在邻接表中的序号(下标),若要输出顶点信息,可使用gi.vertex。3、设指针变量p指向双向链表中结点A,指针变量q指向被插入结点B,要求给出在结点A的后面插入结点B的操作序列(设双向链表中结点的两个指针域分别为llink和rlink)。4、本题要求建立有序的循环链表。从头到尾扫描数组A,取出Ai(0=inext=h; /形成空循环链表for(i=0;in

4、ext; while(p!=h & p-datanext; /查找Ai的插入位置 if(p=h | p-data!=Ai) /重复数据不再输入 s=(LinkedList)malloc(sizeof(LNode); s-data=Ai; pre-next=s; s-next=p;/将结点s链入链表中/for return(h);算法结束5、 二叉树的层次遍历序列的第一个结点是二叉树的根。实际上,层次遍历序列中的每个结点都是“局部根”。确定根后,到二叉树的中序序列中,查到该结点,该结点将二叉树分为“左根右”三部分。若左、右子树均有,则层次序列根结点的后面应是左右子树的根;若中序序列中只有左子树或

5、只有右子树,则在层次序列的根结点后也只有左子树的根或右子树的根。这样,定义一个全局变量指针R,指向层次序列待处理元素。算法中先处理根结点,将根结点和左右子女的信息入队列。然后,在队列不空的条件下,循环处理二叉树的结点。队列中元素的数据结构定义如下:typedef struct int lvl; /层次序列指针,总是指向当前“根结点”在层次序列中的位置int l,h; /中序序列的下上界int f; /层次序列中当前“根结点”的双亲结点的指针int lr; / 1双亲的左子树 2双亲的右子树qnode; BiTree Creat(datatype in,level,int n)/由二叉树的层次序

6、列leveln和中序序列inn生成二叉树。 n是二叉树的结点数if (ndata=level0; p-lchild=null; p-rchild=null; /填写该结点数据for (i=0; ilchild=null; s.lvl=+R; s.l=i+1; s.h=n-1; s.f=p; s.lr=2; enqueue(Q,s); else if (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=+

7、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; idata=levels.lvl; p-lchild=null; p-rchild=null; /填写该结点数据 if (s.lr=1) father-lchild=p; else father-rc

8、hild=p; /让双亲的子女指针指向该结点 if (i=s.l) p-lchild=null; /处理无左子女s.lvl=+R; s.l=i+1; s.f=p; s.lr=2; enqueue(Q,s); else if (i=s.h) p-rchild=null; /处理无右子女 s.lvl=+R; s.h=i-1; s.f=p; s.lr=1; enqueue(Q,s); elses.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)

9、; /右子树有关信息入队列 /结束while (!empty(Q)return(p);/算法结束6、后序遍历最后访问根结点,即在递归算法中,根是压在栈底的。采用后序非递归算法,栈中存放二叉树结点的指针,当访问到某结点时,栈中所有元素均为该结点的祖先。本题要找p和q 的最近共同祖先结点r ,不失一般性,设p在q的左边。后序遍历必然先遍历到结点p,栈中元素均为p的祖先。将栈拷入另一辅助栈中。再继续遍历到结点q时,将栈中元素从栈顶开始逐个到辅助栈中去匹配,第一个匹配(即相等)的元素就是结点p 和q的最近公共祖先。typedef struct BiTree t;int tag;/tag=0 表示结点的

10、左子女已被访问,tag=1表示结点的右子女已被访问stack;stack s,s1;/栈,容量够大BiTree Ancestor(BiTree ROOT,p,q,r)/求二叉树上结点p和q的最近的共同祖先结点r。top=0; bt=ROOT; while(bt!=null |top0)while(bt!=null & bt!=p & bt!=q) /结点入栈s+top.t=bt; stop.tag=0; bt=bt-lchild; /沿左分枝向下if(bt=p) /不失一般性,假定p在q的左侧,遇结点p时,栈中元素均为p的祖先结点for(i=1;i0;i-)/;将栈中元素的树结点到s1去匹配p

11、p=si.t;for (j=top1;j0;j-)if(s1j.t=pp) printf(“p 和q的最近共同的祖先已找到”);return (pp);while(top!=0 & stop.tag=1) top-; /退栈if (top!=0)stop.tag=1;bt=stop.t-rchild; /沿右分枝向下遍历/结束while(bt!=null |top0)return(null);/、p无公共祖先/结束Ancestor7、本题应使用深度优先遍历,从主调函数进入dfs(v)时 ,开始记数,若退出dfs()前,已访问完有向图的全部顶点(设为n个),则有向图有根,v为根结点。将n个顶点从

12、1到n编号,各调用一次dfs()过程,就可以求出全部的根结点。题中有向图的邻接表存储结构、记顶点个数的变量、以及访问标记数组等均设计为全局变量。建立有向图g的邻接表存储结构参见上面第2题,这里只给出判断有向图是否有根的算法。 int num=0, visited=0 /num记访问顶点个数,访问数组visited初始化。 const n=用户定义的顶点数; AdjList g ; /用邻接表作存储结构的有向图g。 void dfs(v) visited v=1; num+; /访问的顶点数1 if (num=n) printf(“%d是有向图的根。n”,v); num=0;/if p=gv.firstarc; while (p) if (visiedp-adjvex=0) dfs (p-adjvex);p=p-next; /while visitedv=0; num-; /恢复顶点v/dfsvoid JudgeRoot()/判断有向图是否有根,有根则输出之。 static int i ;for (i=1;i=n;i+ ) /从每个顶点出发,调用dfs()各一次。 num=0; visited1.n=0; dfs(i); / JudgeRoot算法中打印根时,输出顶点在邻接表中的序号(下标),若要输出顶点信息,可使用gi.vertex。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 网络科技 > 其他相关文档

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报