大家好我是新生小白,今日写了顺序排列的二叉树的删除,自己写的几个测试点进去都还行,不知道有没错误,如果哪里有错误的,或者代码少考虑了什么的可以在评论区提出!
以下是代码内容:
运行结果输出方式为中序遍历!
#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define MAXSIZE 100
typedef int Status;
typedef int ElemType;
typedef struct bst{
ElemType data;
struct bst *lchild,*rchild;
}Node,*LinkBST;
Status inincreadLinkBST(LinkBST &T,ElemType data)//添加节点元素
{
LinkBST p=new Node;
if(!p)
return ERROR;
p->data=data;
p->lchild=p->rchild=NULL;
T=p;
return OK;
}
Status pushdata(LinkBST &T,ElemType data)//树插入元素
{
LinkBST p;
if(T==NULL)
{
inincreadLinkBST(T,data);
return OK;
}
else
{
p=T;
if(p->data>data)
pushdata(T->lchild,data);
else if(p->data<data)
pushdata(T->rchild,data);
else if(p->data==data)
return ERROR;
}
}
void Delete(LinkBST &T,ElemType data,LinkBST &parents);//声明删除函数
ElemType BST_lchild_max(LinkBST &T)//找树的左子树的最大节点返回元素值,并删除
{
LinkBST p=T->lchild,pre=T;
ElemType nv;
if(p!=NULL)
while(p->rchild!=NULL)
{
pre=p;
p=p->rchild;
}
nv=p->data;
Delete(p,nv,pre);
return nv;
}
void Delete(LinkBST &T,ElemType data,LinkBST &parents)//删除元素内容
{
LinkBST p=T,q=parents;
ElemType nv;
if(p->data==data)
{
if(!p->lchild&&!p->rchild)
{
if(q==NULL)
{
T=NULL;
delete p;
return ;
}
else if(q->data>data)
q->lchild=NULL;
else
q->rchild=NULL;
return ;
}
else if(!p->lchild!=!p->rchild)
{
if(p->lchild)
{
if(q==NULL)
T=T->lchild;
else if(q->data>data)
q->lchild=p->lchild;
else
q->rchild=p->lchild;
}
else
{
if(q==NULL)
T=T->rchild;
else if(q->data>data)
q->lchild=p->rchild;
else
q->rchild=p->rchild;
}
delete p;
return ;
}
else if(p->lchild&&p->rchild)
{
nv=BST_lchild_max(T);
p->data=nv;
return ;
}
}
else
{
while(p->data!=data)
{
q=p;
if(p->data>data)
p=p->lchild;
else
p=p->rchild;
}
Delete(p,data,q);
}
}
void pop(LinkBST T)
{
LinkBST p=T;
if(T==NULL)
return;
pop(p->lchild);
cout<<p->data<<" ";
pop(p->rchild);
}
Status look_data(LinkBST T,ElemType data)
{
LinkBST p=T;
if(p==NULL)
return ERROR;
do
{
if(p->data==data)
return OK;
else if(p->data>data)
p=p->lchild;
else
p=p->rchild;
}while(p->data!=data&&p!=NULL);
return ERROR;
}
main()
{
int n,i;
ElemType data[MAXSIZE],e;
LinkBST T=NULL,parents=NULL;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>data[i];
}
for(i=1;i<=n;i++)
pushdata(T,data[i]);
cout<<"请输入要删除的元素:"<<endl;
cin>>e;
if(look_data(T,e))
Delete(T,e,parents);
else
cout<<"没有此元素!"<<endl;
pop(T);
}