以下是用C写的二叉排序树的一个程序,仅供参考:
#include<stdio.h>
#include<malloc.h>#define ENDKEY 0
typedef int keyType;
typedef char ElemType;
typedef struct Node{
keyType key;
ElemType data;
struct Node *lchild,*rchild;
}BiTNode,*BiTree;
BiTree pRoot = NULL;
BiTree InsertBSTree(BiTree &T,keyType kx);
void CreateBSTree(BiTree &T)
{
keyType key;
int i = 0;
T=NULL;
scanf("%d", &key);
while (key!=ENDKEY)
{
i++;
T = InsertBSTree(pRoot, key);
if(i == 1)
pRoot = T;
scanf("%d", &key);
}
}
void InitBSTree(BiTree &T)
{
T=NULL;
}
void DestroyBSTree(BiTree &T)
{
if(T!=NULL)
{
if(T->lchild==NULL && T->rchild==NULL)
{
free(T);
T=NULL;
}
else if(T->lchild != NULL)
{
free(T->lchild);
T->lchild=NULL;
}
else if(T->rchild !=NULL)
{
free(T->rchild);
T->rchild=NULL;
}
}
}
BiTree SearchBSTree(BiTree T,int kx, BiTree& parent)
{
BiTree p;
p=T;
while(p!=NULL)
{
if(kx==p->key)
return p;
else if(kx<p->key)
{
parent = p;
p=p->lchild;
}
else
{
parent = p;
p=p->rchild;
}
}
return NULL;
}
BiTree InsertBSTree(BiTree &T,keyType key)
{
BiTree p,pre,s;
p=T;
pre=NULL;
while(p!=NULL)
{
if(key==p->key)
return p;
else if(key<p->key)
{
pre=p;
p=p->lchild;
}
else if(key>p->key)
{
pre=p;
p=p->rchild;
}
}
s=(BiTree)malloc(sizeof(BiTNode));
s->key=key;
s->lchild=NULL;
s->rchild=NULL;
if(T==NULL)
{
T=s;
return T;
}
else if(key<pre->key)
{
pre->lchild=s;
return pre->lchild;
}
else if(key>pre->key)
{
pre->rchild=s;
return pre->rchild;
}
return NULL;
}
//p: the node which will be deleted
//parent: the parent node of p
void Delete(BiTree &p, BiTree parent)
{
BiTree q,s;
//if p is a leaf
if(!p->rchild && !p->lchild)
{
if(p->key > parent->key)
parent->rchild = NULL;
if(p->key < parent->key)
parent->lchild = NULL;
free(p);
p = NULL; //remember to set p to NULL after free
}
//if p has the NULL right child
else if(!p->rchild)
{
if(p->key > parent->key)
parent->rchild = p->lchild;
if(p->key < parent->key)
parent->lchild = p->lchild;
free(p);
p = NULL; //remember to set p to NULL after free
}
//if p has the NULL left child
else if(!p->lchild)
{
if(p->key > parent->key)
parent->rchild = p->rchild;
if(p->key < parent->key)
parent->lchild = p->rchild;
free(p);
p = NULL; //remember to set p to NULL after free
}
//left and right child not NULL
else
{
q=p;
s=p->lchild ;
while(s->rchild)
{
q=s;
s=s->rchild;
}
p->data=s->data;
p->key=s->key;
if(q!=p)
Delete(s, q);
else
{
q->lchild=s->lchild;
free(s);
s=NULL;
}
}
}
void DeleteBSTree(BiTree &T,keyType key)
{
BiTree p, parent;
if(p=SearchBSTree(T,key, parent))
Delete(p, parent);
}
void InorderTraverse(BiTree T)
{
if(T==NULL)
return;
else
{
InorderTraverse(T->lchild );
printf("%d ",T->key);
InorderTraverse(T->rchild );
}
}
void main()
{
BiTree T, parent;
int ch;
printf("请输入创建二叉排序树的关键码(输入0时跳出创建过程):");
printf("\n");
CreateBSTree(T);
printf("\n");
printf("中序序列为:");
InorderTraverse(pRoot);
printf("\n");
printf("请输入要查找的元素:");
scanf("%d",&ch);
BiTree p1=SearchBSTree(pRoot,ch, parent);
if(p1 != NULL)
printf("%d\n",p1->key);
else
printf("没有你要抄找的元素!\n");
printf("请输入要删除的结点:");
scanf("%d",&ch);
DeleteBSTree(pRoot,ch);
printf("\n");
printf("删除节点后的中序序列为:");
InorderTraverse(pRoot);
printf("\n");
getchar();
}