2010年江苏省数据分析基础

  • 格式:docx
  • 大小:16.72 KB
  • 文档页数:1

1、根据二叉排序树中序遍历所得结点值为增序的性质,在遍历中将当前遍历结点与其前驱结点值比较,即可得出结论,为此设全局指针变量pre(初值为null)和全局变量flag,初值为true。

若非二叉排序树,则置flag为false。

#define true 1
#define false 0
typedef struct node
{datatype data; struct node *llink,*rlink;} *BTree;
void JudgeBST(BTree t,int flag)
// 判断二叉树是否是二叉排序树,本算法结束后,在调用程序中由flag得出结论。

{ if(t!=null && flag)
{ Judgebst(t->llink,flag);// 中序遍历左子树
if(pre==null)pre=t;// 中序遍历的第一个结点不必判断
else if(pre->data<t->data)pre=t;//前驱指针指向当前结点
else{flag=flase;} //不是完全二叉树
Judgebst (t->rlink,flag);// 中序遍历右子树
}//JudgeBST算法结束
2、设有一个数组中存放了一个无序的关键序列K1、K2、…、Kn。

现要求将Kn放在将元素排序后的正确位置上,试编写实现该功能的算法,要求比较关键字的次数不超过n。

51. 借助于快速排序的算法思想,在一组无序的记录中查找给定关键字值等于key的记录。

设此组记录存放于数组r[l..h]中。

若查找成功,则输出该记录在r数组中的位置及其值,否则显示“not find”信息。

请编写出算法并简要说明算法思想。

3、二部图(bipartite graph) G=(V,E)是一个能将其结点集V分为两不相交子集V 1和V2=V-V1的无向图,使得:V1中的任何两个结点在图G中均不相邻,V2中的任何结点在图G中也均不相邻。

(1).请各举一个结点个数为5的二部图和非二部图的例子。

(2).请用C或PASCAL编写一个函数BIPARTITE判断一个连通无向图G是否是二部图,并分析程序的时间复杂度。

设G用二维数组A来表示,大小为n*n(n为结点个数)。

请在程序中加必要的注释。

若有必要可直接利用堆栈或队列操作。


4、设T是一棵满二叉树,编写一个将T的先序遍历序列转换为后序遍历序列的递归算法。