二叉排序树算法程序

以下是用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();
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值