[code]
binarytree.c
#include<stdio.h>
#include<stdlib.h>
#include "binarytree.h"
//1 declare success ,0 declare fail
int bs_search(Tree *base , int key,Tree **p)
{
if(base==NULL)
{
*p=NULL;
return 0;
}
else
{
Tree *temp,*parent;
temp=base;
while(temp!=NULL)
{
if(temp->data==key)
{
*p=temp;
return 1;
}
else if(temp->data<key)
{
parent=temp;
temp=temp->right;
}
else
{
parent=temp;
temp=temp->left;
}
}
*p=parent;
return 0;
}
}
void insert(Tree **base,int key)
{
Tree **p;
Tree *temp;
p=(Tree **)malloc(sizeof(Tree));
if(bs_search(*base,key,p)==0)
{
Tree *s=(Tree *)malloc(sizeof(Tree));
s->right=s->left=NULL;
s->data=key;
s->visited=0;
if(*p==NULL)
{
*base=s;
}
else if(key>(*p)->data)
{
temp=*p;
temp->right=s;
}
else
{
temp=*p;
temp->left=s;
}
}
free(p);
}
void travel(Tree *base)
{
if(base==NULL)
return;
else if(base->visited==0)
{
base->visited=1;
travel(base->left);
printf(" %d ",base->data);
travel(base->right);
}
}
int delete_bst(Tree **base , int key)
{
if(*base==NULL)
return 0;
else if(key==(*base)->data)
return delete(base);
else if(key>(*base)->data)
return delete(&((*base)->right));
else
return delete(&((*base)->left));
}
int delete(Tree **p)
{
Tree *q;
if((*p)->right==NULL)
{
q=*p;
*p=(*p)->left;
free(q);
}
else if((*p)->left==NULL)
{
q=*p;
*p=(*p)->right;
free(q);
}
else
{
Tree *s;
q=*p;
s=(*p)->left;
while(s->right!=NULL)
{
q=s;
s=s->right;
}
(*p)->data=s->data;
if(q!=*p)
q->right=s->left;
else
q->left=s->left;
free(s);
}
return 1;
}
void initial(Tree **base)
{
if(*base==NULL)
return;
(*base)->visited=0;
initial(&((*base)->left));
initial(&((*base)->right));
}
binarytree.h
struct tree
{
int data;
int visited; //0 visited ,1 unvisited
struct tree *left,*right;
};
typedef struct tree Tree;
int bs_search(Tree *base , int key,Tree **p);
void insert(Tree **base, int key);
int delete_bst(Tree **base ,int key);
int delete(Tree **p);
void travel(Tree *base); //inorder
void initial(Tree **base);
[/code]
binarytree.c
#include<stdio.h>
#include<stdlib.h>
#include "binarytree.h"
//1 declare success ,0 declare fail
int bs_search(Tree *base , int key,Tree **p)
{
if(base==NULL)
{
*p=NULL;
return 0;
}
else
{
Tree *temp,*parent;
temp=base;
while(temp!=NULL)
{
if(temp->data==key)
{
*p=temp;
return 1;
}
else if(temp->data<key)
{
parent=temp;
temp=temp->right;
}
else
{
parent=temp;
temp=temp->left;
}
}
*p=parent;
return 0;
}
}
void insert(Tree **base,int key)
{
Tree **p;
Tree *temp;
p=(Tree **)malloc(sizeof(Tree));
if(bs_search(*base,key,p)==0)
{
Tree *s=(Tree *)malloc(sizeof(Tree));
s->right=s->left=NULL;
s->data=key;
s->visited=0;
if(*p==NULL)
{
*base=s;
}
else if(key>(*p)->data)
{
temp=*p;
temp->right=s;
}
else
{
temp=*p;
temp->left=s;
}
}
free(p);
}
void travel(Tree *base)
{
if(base==NULL)
return;
else if(base->visited==0)
{
base->visited=1;
travel(base->left);
printf(" %d ",base->data);
travel(base->right);
}
}
int delete_bst(Tree **base , int key)
{
if(*base==NULL)
return 0;
else if(key==(*base)->data)
return delete(base);
else if(key>(*base)->data)
return delete(&((*base)->right));
else
return delete(&((*base)->left));
}
int delete(Tree **p)
{
Tree *q;
if((*p)->right==NULL)
{
q=*p;
*p=(*p)->left;
free(q);
}
else if((*p)->left==NULL)
{
q=*p;
*p=(*p)->right;
free(q);
}
else
{
Tree *s;
q=*p;
s=(*p)->left;
while(s->right!=NULL)
{
q=s;
s=s->right;
}
(*p)->data=s->data;
if(q!=*p)
q->right=s->left;
else
q->left=s->left;
free(s);
}
return 1;
}
void initial(Tree **base)
{
if(*base==NULL)
return;
(*base)->visited=0;
initial(&((*base)->left));
initial(&((*base)->right));
}
binarytree.h
struct tree
{
int data;
int visited; //0 visited ,1 unvisited
struct tree *left,*right;
};
typedef struct tree Tree;
int bs_search(Tree *base , int key,Tree **p);
void insert(Tree **base, int key);
int delete_bst(Tree **base ,int key);
int delete(Tree **p);
void travel(Tree *base); //inorder
void initial(Tree **base);
[/code]