#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
typedef struct Bitnode
{
int data;
struct Bitnode *lchild,*rchild;
} Bitnode,*Bitree;
int Searchtree(Bitree T,int num,Bitree F,Bitree &P) //在二叉树T种查找元素num F表示前驱 P表示num元素所在的节点
{
if(T==NULL) //未找到该元素
{
P=F; //p表示num元素应当在的位置的前驱
return 0;
}
else if(T->data==num)
{
P=T;
return 1;
}
else if(T->data<=num)
Searchtree(T->rchild,num,T,P);
else
Searchtree(T->lchild,num,T,P);
}
void print_in(Bitree &T) //中序遍历排序二叉树
{
if(T!=NULL)
{
print_in(T->lchild);
printf("%d ",T->data);
print_in(T->rchild);
}
return;
}
void insertTree(Bitree &T,int num) //在二叉排序树T中插入元素NUM
{
Bitree P,s;
int flag=Searchtree(T,num,NULL,P);
if(flag==0)
{
s=(Bitree)malloc(sizeof(Bitnode));
s->data=num;
s->lchild=NULL;
s->rchild=NULL;
if(T==NULL)
T=s;
else if(num<P->data)
P->lchild=s;
else
P->rchild=s;
}
return;
}
void deletenode(Bitree &T) //删除该节点
{
Bitree q,s;
if(T->rchild==NULL)
{
q=T;
T=T->lchild;
free(q);
}
else if(T->lchild==NULL)
{
q=T;
T=T->rchild;
free(q);
}
else
{
q=T;
s=q->lchild;
while(s->rchild)
{
q=s;
s=s->rchild;
}
T->data=s->data;
if(T==q) //T=q 表示 while循环没有执行 T的左儿子的右子树没有节点
q->lchild=s->lchild;
else
q->rchild=s->lchild;
free(s);
}
return;
}
void Deletetree(Bitree &T,int num) //在树种删除元素num
{
if(T==NULL)
return;
if(T->data<num)
Deletetree(T->rchild,num);
else if(T->data>num)
Deletetree(T->lchild,num);
else //找到相同的节点 删除节点操作
{
// cout<<111<<endl;
deletenode(T);
}
return;
}
int main()
{
int m,n,k;
int a;
Bitree T=NULL;
Bitree q;
int i,j;
printf("输入n个元素和k次查找操作和m次删除操作:\n");
scanf("%d%d%d",&n,&k,&m);
while(n--)
{
int num;
scanf("%d",&num);
insertTree(T,num);
}
printf("中序遍历结果\n");
print_in(T);
cout<<endl;
while(k--)
{
printf("请输入要查找的元素:\n");
scanf("%d",&a);
int ans=Searchtree(T,a,NULL,q);
cout<<ans<<endl;
}
while(m--)
{
printf("请输入要删除的元素:\n");
scanf("%d",&a);
Deletetree(T,a);
print_in(T);
cout<<endl;
}
return 0;
}
测试数据:
8 3 3
5 7 8 9 10 15 3 1
9 2 5
10 1 15
数据结构 二叉排序树 操作及实现
最新推荐文章于 2023-10-01 10:41:33 发布