#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
int data;
struct Node *Lchild;
struct Node *Rchild;
}T_Node,*BiTree;
void Insert(BiTree &T,int data)
{
BiTree p,parent,s;
p=T;
while(p)
{
if(data>p->data)
{
parent=p;
p=p->Rchild;
}
else
{
parent=p;
p=p->Lchild;
}
}
s=(BiTree)malloc(sizeof(T_Node));
s->data=data;
s->Lchild=s->Rchild=NULL;
if(s->data>parent->data)
parent->Rchild=s;
else
parent->Lchild=s;
}
void Init_Tree(BiTree &T,int n)
{
int i;
printf("请输入节点\n");
int Bdata,data;
scanf("%d",&Bdata);
T=(BiTree)malloc(sizeof(T_Node));
T->data=Bdata;
T->Lchild=T->Rchild=NULL;
for(i=1;i<n;i++)
{
scanf("%d",&data);
Insert(T,data);
}
}
void IO_Travel(BiTree T)
{
if(T)
{
IO_Travel(T->Lchild);
printf("%d ",T->data);
IO_Travel(T->Rchild);
}
}
void search(BiTree T,int key)
{
BiTree p;
p=T;
while(p)
{
if(key>p->data)
{
p=p->Rchild;
}
else if(key<p->data)
{
p=p->Lchild;
}
else
{
printf("查找%d成功\n",key);
return ;
}
}
printf("查找失败\n");
}
void Delete(BiTree &T,int key)
{
BiTree p,q,par;
p=T;
while(p)
{
if(p->data==key)
break;
else if(key>p->data)
{
par=p;
p=p->Rchild;
}
else
{
par=p;
p=p->Lchild;
}
}
if(!p)
{
printf("未找到删除节点%d\n",key);
return ;
}
if(!p->Lchild)
{
if(p==T)
T=p->Rchild;
else if(par->Lchild==p)
par->Lchild=p->Rchild;
else if(par->Rchild==p)
par->Rchild=p->Rchild;
free(p);
}
else
{
q=p->Lchild;
par=q;
while(q->Rchild)
{
par=q;
q=q->Rchild;
}
if(par==p->Lchild)
{
p->data=par->data;
p->Lchild=par->Lchild;
free(par);
}
else
{
p->data=q->data;
par->Rchild=q->Lchild;
free(q);
}
}
printf("删除%d成功\n",key);
}
int main()
{
int key;
int n;
BiTree T;
printf("请输入节点个数\n");
scanf("%d",&n);
Init_Tree(T,n);
printf("二叉排序树的顺序输出\n");
IO_Travel(T);
putchar('\n');
printf("请输入需要查找的数据\n");
scanf("%d",&key);
search(T,key);
printf("请输入需要删除的数据\n");
scanf("%d",&key);
Delete(T,key);
IO_Travel(T);
putchar('\n');
return 0;
}
二叉树排序树的基本操作
最新推荐文章于 2022-12-06 18:27:41 发布