功能要求:
(1)从键盘输入一组学生记录建立二叉排序树;
(2)中序遍历二叉排序树;
(3)求二叉排序树深度;
(4)求二叉排序树的所有节点数和叶子节点数;
(5)向二叉排序树插入一条学生记录;
(6)从二叉排序树中删除一条学生记录;
(7)从二叉排序树中查询一条学生记录;
(8)以广义表的形式输出二叉排序树
该文件也是本人现在的作业,请不要全部照搬
部分函数体功能介绍及注意
void ask(bsttree T,int num)
该函数用于输入一个成绩信息,输出一个对应的学号信息,如果未找到则输出“未找到”,返回菜单目录,程序继续运行。
void Search(bsttree T,char num[])
该函数用于输入一个学号信息(学号不能超过9位),输出一个对应的成绩信息,如果未找到该学号则输出“未找到”,程序继续运行。
void writefile(bsttree T)
该函数用于保存文件信息。将树的前序遍历的节点信息保存到data.txt文件中。调用该函数前要在主函数同级文件夹中建立data.txt文件。
#include <bits/stdc++.h>
using namespace std;
typedef struct node1
{
int grade;//成绩
char num[10];//学号
}student;
typedef struct node2
{
student data;
struct node2 *left;
struct node2 *right;
}bstnode,*bsttree;
void insertbst(bsttree &T,student e)
{
if(T==NULL)
{
bsttree s=new bstnode;
s->data=e;
s->left=s->right=NULL;
T=s;
}
else if(e.grade < T->data.grade)//递归插入其子树
{insertbst(T->left,e);}
else if(e.grade>T->data.grade)
{insertbst(T->right,e);}
}
void createbst(bsttree &T)
{
T=NULL;
int n;
cout<<"输入节点的个数"<<endl;
cin>>n;
cout<<"依次输入"<<n<<"个学生的成绩和学号"<<endl;
while(n--)
{
student e;
cin>>e.grade;
cin>>e.num;
insertbst(T,e);//调用insert函数
}
cout<<"建立完成"<<endl;
}
void bianli(bsttree T)//中序遍历
{
if(T!=NULL)
{
bianli(T->left);
cout<<"学号:"<<T->data.num<<" "<<"成绩:"<<T->data.grade<<endl;
bianli(T->right);
}
}
int depth(bsttree T)//计算树的高度
{
int leftdepth,rightdepth;
if(T==NULL)return 0;
else{
leftdepth=depth(T->left);
rightdepth=depth(T->right);
if(leftdepth>rightdepth)return (leftdepth+1);//返回左和右中较大的
else return(rightdepth+1);
}
}
int countleave(bsttree T)//计算树叶数
{
int num=0;
if(T==NULL){return 0;}
else if(T->left==NULL&&T->right==NULL){return 1;}
else{
return countleave(T->left)+countleave(T->right);
}//左子树加右子树
}
void ask(bsttree T,int num)//根据成绩查找学号
{
int len=0;bsttree p,s[500];
p=T;
if(T==NULL)return;
while(p!=NULL||len>0)
{
while(p!=NULL)
{
s[len]=p;len++;p=p->left;
}
if(len>0)
{
len--;p=s[len];
if(num==p->data.grade)
{
cout<<"查找成功!"<<endl;
cout<<"学号: "<<p->data.num<<" "<<"成绩:"<<p->data.grade<<endl;
return;
}
p=p->right;
}
}
cout<<"未找到"<<endl;
cout<<endl;
}
void Search(bsttree T,char num[])//根据学号查成绩
{
int len=0;bsttree p,s[500];
p=T;
if(T==NULL)return;
while(p!=NULL||len>0)
{
while(p!=NULL)
{
s[len]=p;len++;p=p->left;
}
if(len>0)
{
len--;p=s[len];
if(strcmp(num,p->data.num)==0)
{
cout<<"查找成功!"<<endl;
cout<<"学号: "<<p->data.num<<" "<<"成绩:"<<p->data.grade<<endl;
return;
}
p=p->right;
}
}
cout<<"未找到"<<endl;
cout<<endl;
}
void deletebst(bsttree &T, int value)
{
if (!T) return;
if (value < T->data.grade) {
deletebst(T->left, value);
}
else if (value > T->data.grade) {
deletebst(T->right, value);
}
else {
// 节点有两个子节点
if (T->left && T->right) {
// 查找右子树的最小值
bsttree minNode = T->right;
while (minNode->left) {
minNode = minNode->left;
}
// 替换值
T->data.grade = minNode->data.grade;
for(int i=0;i<6;i++)
{
T->data.num[i]=minNode->data.num[i];
}
// 删除最小值节点
deletebst(T->right, minNode->data.grade);
}
else {
// 节点只有一个子节点或没有子节点
bsttree temp = T;
T = (T->left) ? T->left : T->right;
delete temp;
}
}
cout<<"删除成功"<<endl;
}
void printbst(bsttree T)//广义表形式输出树
{
cout<<T->data.num;
if(T->left!=NULL)
{
cout<<"(";
printbst(T->left);
if(T->right==NULL)
{
cout<<",)";
}
}
if(T->right!=NULL)
{
if(T->left==NULL)
{
cout<<"(";
}
cout<<",";
printbst(T->right);
cout<<")";
}
}
void writefile(bsttree T)
{
FILE *f;
freopen("data.txt","w",stdout);
int len=0;bsttree p,s[500];
p=T;
if(T==NULL)return;
while(p!=NULL||len>0)
{
while(p!=NULL)
{
s[len]=p;len++;cout<<p->data.grade<<" "<<p->data.num<<endl;
p=p->left;
}
if(len>0)
{
len--;p=s[len];
p=p->right;
}
}
cout<<endl;
fclose(stdout);
freopen("con","w",stdout);
cout<<"已存入data.txt"<<endl;
}
void menu()
{
cout<<"**************欢迎使用本系统 ***************"<<endl;
cout<<"** **"<<endl;
cout<<"** 二叉排序树与文件操作 **"<<endl;
cout<<"** 输入数字,执行相应操作 **"<<endl;
cout<<"** **"<<endl;
cout<<"** 1.建立二叉排序树 **"<<endl;
cout<<"** 2.查看树的中序遍历 **"<<endl;
cout<<"** 3.查看树的高度 **"<<endl;
cout<<"** 4.查看叶子节点个数 **"<<endl;
cout<<"** 5.插入一条学生信息 **"<<endl;
cout<<"** 6.删除一条学生信息 **"<<endl;
cout<<"** 7.根据成绩查询学号 **"<<endl;
cout<<"** 8.查看树的广义表形式 **"<<endl;
cout<<"** 9.根据学号查找学生成绩 **"<<endl;
cout<<"** **"<<endl;
cout<<"** **"<<endl;
cout<<"** 10.保存数据 **"<<endl;
cout<<"** 0.退出程序 **"<<endl;
cout<<"** **"<<endl;
cout<<"********************************************"<<endl;
cout<<endl;
}
int main()
{
bsttree T;
int q=0,flag=1;
while(flag)
{
menu();
cin>>q;
switch(q)
{
case(1):createbst(T);break;
case(2):cout<<"中序遍历的结果为:"<<endl;bianli(T);cout<<endl;break;
case(3):cout<<"树的高度为"<<depth(T)<<endl;break;
case(4):cout<<"叶子个数为"<<countleave(T)<<endl;break;
case(5):student e;cout<<"输入要插入的学生的成绩和学号"<<endl;cin>>e.grade>>e.num;insertbst(T,e);break;
case(6):int key;cout<<"输入要删除的学生的成绩"<<endl;cin>>key;deletebst(T,key);break;
case(7):int num;cout<<"输入成绩"<<endl;cin>>num;ask(T,num);cout<<endl;break;
case(8):cout<<"树的广义表形式如下:"<<endl;printbst(T);cout<<endl;break;
case(9):
{
char tmp[10];cout<<"输入学号"<<endl;
cin>>tmp;Search(T,tmp);break;
}
case(10):writefile(T);break;
case(0):flag=0;break;
getchar();
cout<<"再次回车确认退出"<<endl;
getchar();
system("cls");
}
}
}