#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <windows.h> #include <queue> using namespace std; typedef long long ll; typedef struct node { char no[20]; double key; node *lt,*rt; } bstnode; bool flag=true; void bstinsert(bstnode *&t,double key,char no[])//成绩插入 { if(t==NULL) { t=(bstnode *)malloc(sizeof(bstnode)); t->key=key; strcpy(t->no,no); t->lt=t->rt=NULL; } else if(key<t->key) { bstinsert(t->lt,key,no); } else if(key>t->key) { bstinsert(t->rt,key,no); } return ; } void dfs(bstnode *&t)//中序递归遍历 { if(t==NULL) return ; if(t->lt!=NULL) dfs(t->lt); flag?printf("%s %lf",t->no,t->key):printf(" %s %lf",t->no,t->key); flag=false; if(t->rt!=NULL) dfs(t->rt); return ; } bool findkey(bstnode *&t,double key)//成绩查找 { if(t==NULL) return false; if(t->key==key) return true; if(t->key>key) if(findkey(t->lt,key)) return true; else return false; else if(findkey(t->rt,key)) return true; else return false; } void delkey(bstnode *&t,double key)//按成绩删除 { bstnode *f=t,*fa=t; while(f->key!=key) { if(f->key>key) fa=f,f=f->lt; if(f->key<key) fa=f,f=f->rt; } if(f->lt==NULL&&f->rt==NULL) { if(fa->rt==f) fa->rt=NULL; else fa->lt=NULL; if(f==t)t=NULL; free(f); } else if(f->lt==NULL) { if(fa->lt==f) fa->lt=f->rt; else fa->rt=f->rt; if(f==t)t=t->rt; free(f); } else if(f->rt==NULL) { if(fa->lt==f) fa->lt=f->lt; else fa->rt=f->lt; if(f==t)t=t->lt; free(f); } else { bstnode *tmp=f->lt,*pre=f; while(tmp->rt!=NULL) pre=tmp,tmp=tmp->rt; f->key=tmp->key; if(pre!=f) pre->rt=tmp->lt; else pre->lt=tmp->lt; } return ; } int menu() { int type; system("cls"); printf("1.插入学生数据 "); printf("2.查找学生 "); printf("3.删除学生数据 "); printf("4.显示二叉树的深度 "); printf("5.显示二叉树节点数和叶子节点数 "); printf("6.显示中序遍历序列 "); printf("7.从文件中读取 "); printf("8.退出 "); printf("输入上述序号:"); cin>>type; return type; } int depth=0; void DfsDeepth(bstnode *&t,int lev)//求深度 { if(t==NULL)return ; depth=max(depth,lev); DfsDeepth(t->lt,lev+1); DfsDeepth(t->rt,lev+1); return ; } int leaf=0,nodenum=0; void DfsCount(bstnode *&t) { nodenum++; if(t->lt==NULL&&t->rt==NULL) leaf++; if(t->lt!=NULL) DfsCount(t->lt); if(t->rt!=NULL) DfsCount(t->rt); return ; } void BfsWrite(bstnode *&t) { FILE *fp; fp=fopen("data.txt","w"); if(t==NULL)return ; queue<bstnode *> q; q.push(t); while(!q.empty()) { bstnode *tmp=q.front(); q.pop(); fprintf(fp,"%s %lf ",tmp->no,tmp->key); if(tmp->lt!=NULL) q.push(t->lt); if(tmp->rt!=NULL) q.push(t->rt); } return ; } void FileRead(bstnode *&t) { FILE *fp=fopen("data.txt","r"); char no[50]; double key; while(fscanf(fp,"%s %lf",no,&key)!=EOF) { bstinsert(t,key,no); } return ; } void stop() { cout<<"任意键继续"<<endl; getchar(); getchar(); } int main() { bstnode *student=NULL; int type; bool exit=true; while((type=menu())!=8) { if(type>8) { printf("输入错误!"); continue; } switch(type) { case 1: { printf("输入学生学号和成绩:"); char no[20]; double key; scanf("%s %lf",no,&key); bstinsert(student,key,no); break; } case 2: { printf("查找学生的成绩:"); double key; scanf("%lf",&key); if(findkey(student,key)) printf("查找成功! "); else printf("查找失败! "); stop(); break; } case 3: { printf("删除学生的成绩:"); double key; scanf("%lf",&key); if(findkey(student,key)) delkey(student,key),printf("删除成功!"); else printf("无该学生!"); stop(); break; } case 4: { depth=0; DfsDeepth(student,1); printf("二叉树深度为:%d ",depth); stop(); break; } case 5: { leaf=nodenum=0; DfsCount(student); printf("二叉树的叶子节点数为:%d,节点数为:%d ",leaf,nodenum); stop(); break; } case 6: { flag=true; dfs(student); stop(); break; } case 7: { FileRead(student); printf("读入成功!"); stop(); break; } default : break; } } BfsWrite(student); return 0; }