大家好我是新生小白,由于前面文章出版了bug所以在这个文章进行更新。主要错误地方为判断树里是否有要删除的元素的判断函数(look)出现错误,look里面循环条件出现错误!
以下是全新代码:
#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;elseq->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;elseq->rchild=p->lchild;}else{if(q==NULL)T=T->rchild;else if(q->data>data)q->lchild=p->rchild;elseq->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;elsep=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;while(p!=NULL){if(p->data==data)return OK;else if(p->data>data)p=p->lchild;elsep=p->rchild;}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);elsecout<<"没有此元素!"<<endl;pop(T);
}