/*
功能要求:
(1)从键盘输入一组学生记录建立二叉排序树;
(2)二叉排序树存盘;
(3)由文件恢复内存的二叉排序树;
(4)中序遍历二叉排序树;
(5)求二叉排序树深度;
(6)求二叉排序树的所有节点数和叶子节点数;
(7)向二叉排序树插入一条学生记录;
(8)从二叉排序树中删除一条学生记录;
(9)从二叉排序树中查询一条学生记录;
(10)以广义表的形式输出二叉排序树
等功能。
注:第十个广义表我没做,不会T_T
*/
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iomanip>
#include <fstream>
#include <math.h>
using namespace std;
int sum;
//定义学生记录类型
struct student {
char num[20];//学号
int grade;//成绩
};
//定义二叉排序树节点值的类型为学生记录类型
typedef struct student ElemType;
//定义二叉排序树的节点类型
typedef struct bnode {
ElemType data;
struct bnode *lchild;
struct bnode *rchild;
}BNode,*BiTree;
/*在根指针T所指的二叉排序树中递归地查找某关键字为key的数据元素,
如果查找成功,则指针p只想该数据元素结点并返回1,否则p指向查找路
径上访问的最后一个结点并返回0,指针f指向T的双亲,初值为NULL。*/
int searchBST(BiTree T,ElemType key,BiTree f,BiTree &p)
{
if(!T) //如果根指针为空,即查找失败,p置空,返回0
{
p=f;
return 0;
}
else if(strcmp(key.num,T->data.num)==0&&key.grade==T->data.grade) //如果根指针所指结点的值就是要查找的值,p就等于T,返回1
{
p=T;
return 1;
}
else if(key.grade<T->data.grade) //如果要查的值比根节点小,就到T的左子树去找
return searchBST(T->lchild,key,T,p);
else
return searchBST(T->rchild,key,T,p); //如果要查的值比根节点大,就到T的左子树去找
}
/*当二叉排序树T中不存在关键字e时,插入e并返回1,否则返回0*/
int InsertBST(BiTree &T,ElemType e)
{
BiTree p,s; //p为查找关键字e路径上最后一个结点的指针,或者是指向关键字e的指针
//s为插入新结点所需要开辟的空间首地址
if(!searchBST(T,e,NULL,p)) //如果查找失败,说明要进行插入操作
{
s=(BiTree)malloc(sizeof(BNode));
s->data.grade=e.grade;
strcpy(s->data.num,e.num);
s->lchild=s->rchild=NULL; //s肯定是没有孩子的
if(!p) //如果p为空,说明T就是一颗空树,直接让s当根就好了
T=s;
else if(e.grade<
二叉排序树与文件的操作(C、C++)
最新推荐文章于 2025-05-19 16:27:37 发布