二叉排序树
来源:互联网 发布:淘宝不需要保证金 编辑:程序博客网 时间:2024/04/29 21:24
【二叉排序树与文件操作】
功能要求:
(1)从键盘输入一组学生记录建立二叉排序树;
(2)二叉排序树存盘;
(3)由文件恢复内存的二叉排序树;
(4)中序遍历二叉排序树;
(5)求二叉排序树深度;
(6)求二叉排序树的所有节点数和叶子节点数;
(7)向二叉排序树插入一条学生记录;
(8)从二叉排序树中删除一条学生记录;
(9)从二叉排序树中查询一条学生记录;
(10)以广义表的形式输出二叉排序树
等功能。
//定义学生记录类型
Struct student {
Char num[6];//学号
Int grade;//成绩
};
//定义二叉排序树节点值的类型为学生记录类型
typedef student ElemType;
//定义二叉排序树的节点类型
typedef Struct BSTNode {
ElemType data;
Struct BSTNode *left;
Struct BSTNode *rchild;
} BSTNode;
代码:
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>using namespace std;struct student { char num[6];//学号 int grade;//成绩};typedef student ElemType;typedef struct BSTNode { ElemType data; struct BSTNode *lchild; struct BSTNode *rchild;} BSTNode,*BSTree;BSTNode *pre=NULL;int n; int found(BSTree T,char c[]) ///查找 { BSTNode *p=T; while (p !=NULL) { if (strcmp(p->data.num,c)==0) { return 1; } else if (strcmp(p->data.num,c)>0) { pre=p;p=p->lchild; ///查左子树; } else { pre=p;p=p->rchild; ///查右子树; } } return 0; } void insert(BSTree &T,student a)///插入算法 { BSTree s; char c[6]; strcpy(c,a.num); if (found(T,c)==0) { s=(BSTree)malloc(sizeof(BSTNode)); s->data=a; s->lchild=NULL; s->rchild=NULL; if (T==NULL) {T=s;} ///新结点作为根结点; else if(strcmp(s->data.num,pre->data.num)<0) pre->lchild=s; ///插入左子树; else pre->rchild=s; ///插入右子树; } } void InOrderTraverse(BSTree T) {///中序遍历算法 if (T!=NULL) { InOrderTraverse(T->lchild); cout<<T->data.num<<" "<<T->data.grade<<endl; InOrderTraverse(T->rchild); } } int Delete(BSTree &p)/// 从二叉排序树中删除节点p, 并重接它的左或右子树 { BSTree q, s; if( !p->lchild && !p->rchild )/* p为叶子节点 */ p = NULL; else if( !p->lchild )/* 左子树为空,接右子树 */ { q = p; p = p->rchild; free(q); } else if( !p->rchild )/* 右子树为空,接左子树 */ { q = p; p = p->lchild; free(q); } else/* 左右子树均不为空 */ { q = p; s = p->lchild; while(s->rchild)/* 转左,然后向右走到尽头*/ { q = s; s = s->rchild; } strcpy(p->data.num,s->data.num); if( q != p )/* 判断是否执行上述while循环 */ q->rchild = s->lchild;/* 执行上述while循环,重接右子树 */ else q->lchild = s->lchild;/* 未执行上述while循环,重接左子树 */ free(s); } cout<<"删除成功\n"; n--; return 1; } int DeleteBST(BSTree &T, student a) { char c[6]; strcpy(c,a.num); if(found(T,c)==0) printf("无节点\n"); else { if( strcmp(c,T->data.num)==0) Delete(T); else if( strcmp(c,T->data.num)<0) return DeleteBST(T->lchild, a); else return DeleteBST(T->rchild, a); } }void F1( BSTree &t){ t=NULL; int i; student a; printf("输入节点数量:\n"); scanf("%d",&n); for(i=1;i<=n;i++) { printf("请输入第%d节点:\n",i); cout<<"学号:"; cin>>a.num; cout<<"成绩:"; cin>>a.grade; insert(t,a); }}void F22(BSTree T,FILE *w){///先序遍历二叉树的递归算法if (T){fprintf(w,"%s %d\n",T->data.num,T->data.grade);F22(T->lchild,w);F22(T->rchild,w);}}void F2(BSTree T) {///先序遍历(存盘)算法 FILE *w=fopen("D:\\text.txt","w+"); F22(T,w); cout<<"存盘成功\n"; fclose(w); }BSTree F3()///从文件中读取先序序列重建二叉排序树{ FILE *w=fopen("D:\\text.txt","r+"); student a; n=0; BSTree t=NULL; while(!feof(w)) { fscanf(w,"%s %d\n",&a.num,&a.grade); insert(t,a);n++; } fclose(w); return t;}int F5(BSTree T){///求二叉树深度int depl,depr;if (T==NULL) return 0; else {depl=F5(T->lchild);depr=F5(T->rchild);if (depl>=depr) return (depl+1);else return (depr+1); }}int F6(BSTree T) ///求叶子结点的个数{if(!T) return 0; //空树没有叶子 else if(T->lchild==NULL&&T->rchild==NULL) return 1; //叶子结点 else return F6(T->lchild)+F6(T->rchild); //左子树叶子数加上右子树叶子数}void F7(BSTree t){ student a; cout<<"请输入新增的学生信息:\n"; cout<<"学号:";cin>>a.num; cout<<"\n成绩:";cin>>a.grade; insert(t,a); n++; cout<<"插入成功\n";}void F8(BSTree t){ student a; printf("\n请输入要删除的节点:\n"); scanf("%s",a.num); DeleteBST(t,a);}void F9(BSTree t){ BSTNode *p=t; char c[7]; cout<<"请输入要查询的学号:"; cin>>c; int flag=0; while (p !=NULL) { if (strcmp(p->data.num,c)==0) { cout<<"查询到记录如下:\n"; cout<<"学号: "<<p->data.num<<" 成绩:"<<p->data.grade<<endl; flag=1;break; } else if (strcmp(p->data.num,c)>0) { pre=p;p=p->lchild; ///查左子树; } else { pre=p;p=p->rchild; ///查右子树; } } if(flag==0) cout<<"未查询到相关数据\n"; return ;}void F10(BSTree t){ if(t!=NULL) { cout<<t->data.num;//<<" "<<t->data.grade; if(t->lchild!=NULL||t->rchild!=NULL) { cout<<"("; F10(t->lchild); if(t->rchild!=NULL) { cout<<","; } F10(t->rchild); cout<<")"; } }}void init(){ cout<<"请选择操作\n"; cout<<"(1)从键盘输入一组学生记录建立二叉排序树;\n"; cout<<"(2)二叉排序树存盘;\n"; cout<<"(3)由文件恢复内存的二叉排序树;\n"; cout<<"(4)中序遍历二叉排序树;\n"; cout<<"(5)求二叉排序树深度;\n"; cout<<"(6)求二叉排序树的所有节点数和叶子节点数;\n"; cout<<"(7)向二叉排序树插入一条学生记录;\n"; cout<<"(8)从二叉排序树中删除一条学生记录;\n"; cout<<"(9)从二叉排序树中查询一条学生记录;\n"; cout<<"(10)以广义表的形式输出二叉排序树\n";}void solve(){ BSTree t=NULL; int a,aa; init(); while(cin>>a) { int f=0; switch(a) { case 0:f==1;break; case 1:F1(t);break; case 2:F2(t);break; case 3:t=F3();break; case 4:InOrderTraverse(t);break; case 5: aa=F5(t);cout<<"二叉排序树深度为: "<<aa;break; case 6: aa=F6(t);cout<<"二叉排序树的所有节点数为:"<<n<<" 二叉排序树的叶子节点数为:"<<aa;break; case 7:F7(t);break; case 8:F8(t);break; case 9:F9(t);break; case 10:F10(t);break; } if(f==1)break; cout<<endl; init(); } return ;}int main(){ solve(); return 0;}
测试数据
1020153345201522562015446520151196201523962015378920156679201524932015556420157891
阅读全文
0 0
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 二叉排序树
- 软件工程5-软件详细设计
- Java基础篇之DOS基本操作
- java密码强度检测
- caffe示例实现之5用CaffeNet训练与测试自己的数据集
- 如何安装pip
- 二叉排序树
- View的事件体系(一)——View的基础知识以及View的滑动
- javascript基础3
- androidstudio集成开发环境搭建
- MapReduce的自定义排序、分区和分组
- hexo入门学习(四):文章(带图片)
- JavaScript通过preventDefault()使input[type=text]禁止输入但保留光标
- Oracle提供的jniDoc
- 【面经笔记】C、C++内存管理