二叉树先序删除
#include
#include
typedef struct node
{
int key;
struct node *lchild,*rchild; }node;
node *insert(struct node *t,int k)//鍏堝簭鎺掑簭
{
int a,i=0;
struct node *p,*q,*s,*h=NULL;
struct node *arry[100]; q=(struct node*)malloc(sizeof(struct node));
s=(struct node*)malloc(sizeof(struct node));
q->lchild=NULL;
q->rchild=NULL;
q->key=k;
if(t==NULL)
{
t=q;
return t;
}
else{
p=t;
while(p||i!=0){
while(p)
{
if(k > p->key)
h=p;
arry[i++]=p; p=p->lchild;
}
p=arry[--i]; p=p->rchild; }
if(h==NULL){
q->lchild=t;
t=q;
return t;
} if(h->lchild!=NULL && h->rchild!=NULL)
{
if(h->lchild > h->rchild)
{
s=h->lchild;
q->lchild=s;
h->lchild=q;
}
else
{
s=h->rchild;
q->rchild=s;
h->rchild=q;
}
}
else {
if(h->lchild!=NULL){
h->rchild=h->lchild;
h->lchild=q;
}
else
h->lchild=q;
}
}
return t;
}
struct node* dele(struct node *t)//鍏堝簭鍒犻櫎
{
int d,i=0;
int a;
struct node *s=NULL,*p,*h,*q,*f,*head;
struct node *arry[100];
s=(struct node*)malloc(sizeof(node));
printf("input delete num:"); scanf("%d",&d);
p=t;
while( p||i!=0)
{
while(p!=NULL)
{
if(p->key==d){
s=p;
}
if(p->rchild && p->rchild->key==d){
f=p;
}
if(p->lchild && p->lchild->key==d){
f=p;
}
arry[i++]=p;
p=p->lchild;
}
p=arry[--i];
p=p->rchild;
}
if(s->lchild!=NULL && s->rchild!=NULL)
{
if(f->lchild!=NULL && f->lchild->key==d)
f->lchild = s->lchild;
else if(f->rchild!=NULL && f->rchild->key==d)
f->rchild=s->lchild;
head=s->lchild;
while(head->rchild!=NULL) {
head=head->rchild;
}
if(t->key==d)
{
t=s->lchild;
head->rchild=s->rchild;
return t;
}
else {
head->rchild=s->rchild;
return t;
}
}
else if(s->lchild!=NULL && s->rchild==NULL)
{
if(t->key==d){
t=s->lchild;
return t;
}
if(f->lchild->key==d)
f->lchild=s->lchild;
else
f->rchild=s->lchild;
return t;
}
else if(s->lchild==NULL && s->rchild!=NULL)
{
if(t->key==d){
t=s->rchild;
return t;
}
if(f->lchild->key==d)
f->lchild=s->rchild; else
f->rchild=s->rchild;
return t;
}
else if(s->lchild==NULL && s->rchild==NULL)
{
if(t->key==d){
t=NULL;
return t;
}
if(f->lchild->key==d)
f->lchild=NULL;
else
f->rchild=NULL;
return t;
}
}
int i=0;
void display(struct node *t) {
struct node *s=t;
if(s){
printf("%d\t",s->key); i++;
if(i%5==0) printf("\n") ;
display(s->lchild);
display(s->rchild);
}
free(t);
}
int main(int argc,char *argv[]) {
int i;
int a[10]={3,1,6,2,10,23,20,9,18,5};
struct node *t=NULL;
for(i=0;i<10;i++)
t=insert(t,a[i]);
for(i=0;i<2;i++)
t=dele(t);
display(t);
}