二叉树操作系统(二叉排序树)头文件部分:
#define INF 0xffffff
void Insert_BTree(BTree *root,DataType data)
{
BTree s;
if(*root==NULL) //明白这样子写代码的思路吗
{
s=(BTNode *)malloc(sizeof(BTNode)); //什么时候在非初始化函数形参内用二级指针或者引用类型
s->data=data;
s->lchild=NULL;
s->rchild=NULL;
*root=s;
}
else if((*root)->data>data)
Insert_BTree(&((*root)->lchild),data);
else if((*root)->data<data)
Insert_BTree(&((*root)->rchild),data);
}
int Search_BTree(BTree root,DataType data) //二叉排序树查找操作
{
BTNode *p;
p=root;
while(p)
{
if(p->data==data)
return p->data;
if(p->data>data)
p=p->lchild;
else
p=p->rchild;
}
return INF;
}
void Create_BTree(BTree *root)
{
int i,data,cnt;
*root=NULL;
printf("请输入二叉排序树节点的数目:\n");
scanf("%d",&cnt);
printf("请输入各节点数据,相邻数据之间用空格隔开:\n");
for(i=1;i<=cnt;i++)
{
scanf("%d",&data);
Insert_BTree(root,data);
}
}
void Delete_BTree(BTree root,DataType data)
{
BTree p,father,sc,q;
p=root;
father=NULL;
while(p) //匹配元素data或者p==NULL时跳出循环
{
if(p->data==data) //匹配后p就是要被删除的节点
break;
father=p; //father总是存放p的父亲节点
if(p->data>data)
p=p->lchild;
else if(p->data<data)
p=p->rchild;
}
if(p==NULL) //开始分类讨论
{
printf("元素不存在,删除失败!!!\n");
return ;
}
if(p->lchild==NULL) //删除与插入仍然要符合二叉排序树的性质
{
if(father->lchild==p)
father->lchild=p->rchild;
else
father->rchild=p->rchild;
free(p);
}
else //p的左子树不为空
{ //既然p左子树不为空,那我肯定是要找左子树的最大节点
q=p; //或者是右子树的最小节点,但是
sc=p->lchild;
while(sc->rchild) //这种方式直到sc为叶子节点或者只有左子树的节点
{ //最终sc就是p左子树的最大节点
q=sc;
sc=sc->rchild;
}
if(q==p) //此时p节点的右子树为空
q->lchild=sc->lchild;
else //此时p的左子树的右子树不为空,
q->rchild=sc->lchild; //想想为什么是这样,因为这样才能维持二叉排序树的性质
p->data=sc->data;
free(sc);
}
}
void In_order_Rec_BST(BTree root)
{
if(root)
{
In_order_Rec_BST(root->lchild);
printf("%d ",root->data);
In_order_Rec_BST(root->rchild);
}
}
void Fuction_BTree(BTree root)
{
int data,chioce,t;
system("cls");
printf("\t 二叉排序树应用 \n");
printf("\t 1. 创建二叉 \n");
printf("\t 2. 搜索节点 \n");
printf("\t 3. 插入节点 \n");
printf("\t 4. 删除节点 \n");
printf("\t 0. 退出 \n");
printf("请输入相应操作: \n");
scanf("%d",&chioce);
while(!(chioce>=0&&chioce<=4)) //输入序号不存在,操作出错
{
printf("输入有问题,请重新输入:");
scanf("%d",&chioce);
}
while(chioce!=0)
{ //建立循环选择不同的操作
switch(chioce)
{
case 1: //选择操作1即二叉排序树的创建
printf("创建二叉树: \n");
Create_BTree(&root);
In_order_Rec_BST(root);
printf("\n");
break;
case 2: //选择操作2即在二叉排序树中进行查找
printf("请输入你想搜索的节点存储元素信息: \n");
scanf("%d",&data);
t=Search_BTree(root,data);
if(t!=INF)
{
printf("查找成功: ");
printf("%d\n",t);
}
else
printf("关键字不存在\n");
break;
case 3: //选择操作3即在二叉排序树中进行插入操作
printf("请输入你想插入的节点存储元素信息: \n");
scanf("%d",&data);
Insert_BTree(&root,data);
In_order_Rec_BST(root);
printf("\n");
break;
case 4: //选择操作4即在二叉排序树中进行删除操作
printf("请输入你想删除的节点存储信息: \n");
scanf("%d",&data);
Delete_BTree(root,data);
In_order_Rec_BST(root);
printf("\n");
break;
}
printf("请继续进行相应操作:");
scanf("%d",&chioce);
}
return ;
}
数据结构课程设计-二叉树操作系统
最新推荐文章于 2024-01-21 11:48:52 发布