1、某某工业大学应数刘智煌数据结构某某课程设计课程名称数据结构课程设计题目名称二叉排序树的实现学生学院应用数学学院专业班级学 号学生姓名指导教师刘大哥2016年平台VC+6.0问题二叉排序树的实现二叉排序补充概念(也可以参考书上第九章第二节) 左子树的数据总是大于根和右子树的数据,这种就叫做二叉排序树,简单一点,二叉树左边的数据大于右边. 1)编程实现二叉排序树,包括生成、插入,删除;2)对二叉排序树进行先根、中根、和后根非递归遍历;3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信息(至少包括学号、姓名、成绩3
2、项),对比查找效率,并说明在什么情况下二叉排序树效率高,为什么? 5)格式就要按照我们作业的要求,对数据测试,分析,总结和改进的工作要做的详细一点代码实现#include#include#include#include#include#include#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -1typedef int Status;typedef int StudentITREE1ype;#define N 100 #define SIZE 100 #define INC 100#defin
3、e EQ(a,b) (a)=(b)#define LT(a,b) (a)(b)#define LQ(a,b) (a)=S.size)/有空间可以储存 S.base=(BiTree *)realloc(S.base,(S.size+INC) * sizeof(BiTree);/有空间就把输入的数推进栈里,没有就退出程序。 if(!S.base) exit(OVERFLOW); S.top=S.base+S.size; S.size+=INC; *S.top+=e; return 1;Status Pop(SqStack &S,BiTree &e)/把数推出指针 if(S.top=S.base)
4、return 0;/ e=*-S.top;/把不需要的数推出 return 1;int StackEmpty(SqStack S)/测试是不是空栈 if(S.base=S.top) return 1; else return 0;/队列typedef BiTree QElemType;/构造一个树typedef struct QNode QElemType data; QNode *next;/*next指针*QueuePtr;struct LinkQueue/构造一个队列 QueuePtr front,rear;Status InitQueue(LinkQueue &Q)/队列类型 if(!
5、(Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode) exit(OVERFLOW);/如果首队列尾队列队列,申请空间储存结点,结束程序 Q.front-next=NULL; return 1;Status EnQueue(LinkQueue &Q,QElemType e) QueuePtr p; if(!(p=(QueuePtr)malloc(sizeof(QNode) exit(OVERFLOW); p-data=e; p-next=NULL; Q.rear-next=p; Q.rear=p; return 1;Status DeQueue(LinkQ
6、ueue &Q,QElemType &e) QueuePtr p; if(Q.front=Q.rear) return 0; p=Q.front-next; e=p-data; Q.front-next=p-next; if(Q.rear=p) Q.rear=Q.front; free(p); return 1;/二叉排序树Status InitDSTable(BiTree &TREE1)/构造一棵树叫TREE1 TREE1=NULL; return 1;BiTree SearchBST(BiTree T,StudentITREE1ype key)/查找树里面的学号 if(!T|EQ(key,
7、T-data.key)/比较输入的学号和树里面的学号 return T; else if LT(key,T-data.key) return SearchBST(T-lchild,key);/如果相同返回树 else return SearchBST(T-rchild,key); Status SearchBST(BiTree &T,StudentITREE1ype key,BiTree f,BiTree &p) if(!T) p=f; return 0; /如果非空,把f的值赋给p else if EQ(key,T-data.key) p=T; return 1; else if LT(ke
8、y,T-data.key) return SearchBST(T-lchild,key,T,p); else return SearchBST(T-rchild,key,T,p); /不同就重复查找直到相同 Status InsertBST(BiTree &T, ElemType e)/插入结点信息 BiTree p,s; if(!SearchBST(T,e.key,NULL,p) s=(BiTree)malloc(sizeof(BiTNode); s-data=e;/插入结点 s-lchild=s-rchild=NULL;/左右孩子指针等于空值 if(!p) T=s; /若果非空树,s的值赋
9、给T。 else if LT(e.key,p-data.key) p-lchild=s; else p-rchild=s; return 1; /如果e.key大于data.key,则插入左孩子指针,否则插入右孩子指针 else return 0; /删除树 void Delete(BiTree &p) BiTree q,s; if(!p-rchild) q=p; p=p-lchild; free(q); /如果,右孩子没有p,则在左孩子找p else if(!p-lchild) q=p; p=p-rchild; free(q); /如果左孩子没有p,则在右孩子中找。 else q=p; s=
10、p-lchild;/把左孩子中p赋给s。 while(s-rchild) q=s; s=s-rchild; /循环直到右孩子不存在s。 p-data=s-data; /把找到最后一个右孩子的值赋给p/整段把树左边移到右边。 if(q!=p) /如果q不等于p q-rchild=s-lchild; /右孩子树移到左边 else q-lchild=s-lchild; /否则s的值赋给q free(s); Status DeleteBST(BiTree &T,StudentITREE1ype key)/删除树 if(!T) return 0; else if EQ(key,T-data.key) D
11、elete(T); else if LT(key,T-data.key) DeleteBST(T-lchild,key); else DeleteBST(T-rchild,key); return 1; /循环找和删除。int BiTreeDepth(BiTree T)/树的深度 int i,j; if(!T) return 0; if(T-lchild) i=BiTreeDepth(T-lchild); else i=0; if(T-rchild) j=BiTreeDepth(T-rchild); else j=0; return ij?i+1:j+1;/若左孩子存在,循环寻找直到左孩子不存
12、在,找到树的深度,返回树的深度。void Visit(ElemType e)/查看结点中学号 printf(%d-,e.key);/中序遍历Status InOrderTraverse(BiTree T) BiTree p; SqStack S; InitStack(S);Push(S,T); while(!StackEmpty(S) while(GetTop(S,p)&p) Push(S,p-lchild); Pop(S,p); if(!StackEmpty(S) Pop(S,p); Visit(p-data); Push(S,p-rchild); printf(n); return 1;/
13、前序遍历Status PreOrderTraverse(BiTree T) BiTree p; SqStack S; InitStack(S);Push(S,T); while(!StackEmpty(S) while(GetTop(S,p)&p) Push(S,p-lchild); Visit(p-data); Pop(S,p); if(!StackEmpty(S) Pop(S,p); Push(S,p-rchild); printf(n); return 1;/后序遍历Status PostOrderTraverse(BiTree T) SqStack S;SqStack R; BiTre
14、e p;BiTree r;InitStack(S);InitStack(R); Push(S,T); while(!StackEmpty(S) while(GetTop(S,p)&p) Push(S,p-lchild); Pop(S,p); if(!StackEmpty(S) if(!StackEmpty(R) GetTop(R,r); if(GetTop(S,p)&p-rchild&p!=r) Push(S,p-rchild);Push(R,p); else Pop(S,p);Visit(p-data); if(r=p) Pop(R,r); p=NULL;Push(S,p); printf(
15、n); return 1;void ShowTree(BiTree T) /层次遍历法显示树 LinkQueue q; BiTree s; int d,t,i,n,num; d=t=i=n=0; num=1; d=BiTreeDepth(T); if(T) InitQueue(q); EnQueue(q,T); while(num=(pow(2,d)-1) if(num=pow(2,i) printf(n); i+; t=0; n=(int)pow(2,d-i+t); for(int x=1;xdata.key);num+; if(s&s-lchild) EnQueue(q,s-lchild)
16、; else EnQueue(q,NULL); if(s&s-rchild) EnQueue(q,s-rchild); else EnQueue(q,NULL); printf(n);int ShowTree2(BiTree T,int n)/递归法显示树 int i; if(T=NULL) return 1; ShowTree2(T-rchild,n+1); for(i=0;idata.key); ShowTree2(T-lchild,n+1);int main() BiTree TREE1,p=NULL; StudentITREE1ype key;char name10;int score
17、;ElemType e; printf( 1: Build the Binary Sort Tree 2:Insert the Nodes 3: Delete Nodes 4: preOrderTraverse ,InOrderTraverse, postOrderTraverse 5: build 50Nodes and test the efficiency n); while(true) char choise;scanf(%c,&choise); if (choise=q) break; switch(choise) case 1 : InitDSTable(TREE1); print
18、f(nnnPlease insert the number of the Nodes you want :(x) ); int N1;scanf(%d,&N1); printf(please insert :nnKeyStudents name score n) for(int i=0;idata.key,p-data.name,p-data.score); DeleteBST(TREE1,N2); ShowTree(TREE1); break; case 3 : printf(PreOrderTraverse:n); PreOrderTraverse(TREE1); printf(InOrd
19、erTraverse:n); InOrderTraverse(TREE1); printf(:PostOrderTraversen); PostOrderTraverse(TREE1); break; case e : InitDSTable(TREE1); struct ElemType rN=43,name,43,25,name,35,48,name,48,1,name6,82, 24,name,32,9,name,85,38,name,36,28,name,36,27,name,37, 23,name,33,12,name,12,40,name,38,13,name,13,45,name
20、,14, 29,name,39,35,name,35,21,name,31,30,name,38,20,name,20, 11,name,11,31,name,31,19,name,19,32,name,32,18,name,18, 47,name,14,8,name4,80,5,name8,84,4,name2,78,17,name,17, 49,name,14,34,name,32,16,name,16,15,name,15,3,name7,83, 41,name,14,36,name,34,14,name,14,2,name1,4,26,name,34, 7,name9,85,39,na
21、me,39,46,name,46,10,name5,81,22,name,30, 42,name,44,33,name,33,44,name,44,6,name3,79,37,name,37, 50,name,50; for(int i=0;iN-1;i+) InsertBST(TREE1,ri); int n = 10000000;/总共查找次数 double start = clock(); /查找二叉排序树开始时间 for(int i=0;idata.key,p-data.name,p-data.score); double finish = clock();/查找二叉排序树结束时间 double time = finish-start; printf(在二叉排序树里随机查找任意一个关键字%d次所需时间为:%lf,n,time); start = clock();/查找数组开始时间 for(int i=0;in;i+) srand(i);/随循环设置随机种子 int randnumber = rand()%50;/每一次给定一个0到50的随机数
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1