当前位置:文档之家› 二叉排序树的算法实现

二叉排序树的算法实现

韩山师范学院
实验题目:
二叉排序树的算法实现
班级:2015级软工班作者:黄俊聪
#include<iostream>
using namespace std;
#define ENDFLAG 0
typedefintKeyType;
typedefintInfoType;
typedefstructBSTNode
{
KeyType data;//每个结点的数据域包括关键字项和其他数据项
structBSTNode *lchild,*rchild;//左右孩子指针
InfoTypeotherinfo;//其他数据项
}BSTNode,*BSTree;
voidInsertBST(BSTree&T,int key)
{//当二叉排序树T中不存在关键字等于e.key的数据元素,则插入该元素BSTree S;
if(!T)
{//找到插入位置,递归结束
S=new BSTNode;//生成新结点*S
S->data=key;//新结点*S的数据域为e
S->lchild=S->rchild=NULL;//新结点*S作为叶子结点
T=S;//把新结点*S链接到已找到的插入位置
}
else if(key<T->data)
InsertBST(T->lchild,key);//将*S插入左子树
else if(key>T->data)
InsertBST(T->rchild,key);//将*S插入右子树
}
voidCreatBST(BSTree& T)
{
int key;
T=NULL;//将二叉排序树T初始化为空树
cout<<"请输入元素:"<<endl;
cin>>key;
while(key!=ENDFLAG)//ENDFLAG为自定义常亮,作为输入结束标志
{
InsertBST(T,key);//将此结点插入二叉排序树T中
cin>>key;
}
cout<<"创建成功:"<<endl;
}
voidDeleteBST(BSTree&T,KeyType key)
{
BSTreep,f,q,s;
p=T;
f=NULL;//初始化
/*------下面的while循环从根开始查找关键字等于key的结点*p--------*/ while(p)
{
if(p->data==key)
break;//找到关键字等于key的结点*p,结束循环
f=p;//*f为*p的双亲结点
if(p->data>key)
p=p->lchild;//在*P的左子树中继续查找
else
p=p->rchild;//在*P的右子树中继续查找
}
if(!p)
return;
/*---考虑3中情况实现P所指向子树内部的处理:*P左右子树均不空、无右子树、无左子树---*/
q=p;
if((p->lchild)&&(p->rchild))//被删除结点*P左右子树均不空
{
s=p->lchild;
while(s->rchild)//在*P的左子树中据需查找其前驱结点,即最右下结点
{
q=s;
s=s->rchild;//向右到尽头
}
p->data=s->data;//S指向被删除结点的"前驱"
if(q!=p)
q->rchild=s->lchild;//重接*q的右子树
else
q->lchild=s->lchild;//重接*q的左子树
delete s;
return;
}
else if(!p->rchild)//被删除结点*P无右子树,只需重接其左子树
{
p=p->lchild;
}
else if(!p->lchild)//被删结点*P无左子树,只需重接其右子树
{
p=p->rchild;
}
/*-----将P所指的子树挂接到其双亲结点*f相应的位置---*/
if(!f)
T=p;//被删除结点为根结点
else if(q==f->lchild)
f->lchild=p;//挂接到*f的左子树位置
else
f->rchild=p;//挂接到*f的右子树位置
delete q;
}
BSTreeSearchBST(BSTreeT,KeyType key)
{//在跟指针T所指二叉排序树中递归地查找某关键字等于key的数据元素//若查找成功,则返回指向改数据元素结点的指针,否则返回空指针if(!T||key==T->data)
return T;//查找结束
else if(key<T->data)
return SearchBST(T->lchild,key);//在左子树中继续查找else
return SearchBST(T->lchild,key);//在右子树中继续查找
}
void Print(BSTree T)
{
if(T)
{
Print(T->lchild);
cout<<"此时树为:"<<T->data<<" "<<endl;
Print(T->rchild);
}
}
int main()
{
BSTree T;
int n;
int key;
cout<<"****1.创建****"<<endl;
cout<<"* 2.查找*"<<endl;
cout<<"* 3.插入*"<<endl;
cout<<"* 4.删除*"<<endl;
cout<<"* 5.输出*"<<endl;
cout<<"****6.结束****"<<endl;
cout<<"请输入要操作的功能序号:"<<endl;
cin>>n;
while(1)
{
switch(n)
{
case 1:
CreatBST( T);
break;
case 2:
cout<<"请输入要查找的元素:"<<endl;
cin>>key;
SearchBST(T,key);
cout<<"查找成功"<<endl;
break;
case 3:
cout<<"请输入要插入的元素:"<<endl;
cin>>key;
InsertBST(T,key);
cout<<"插入成功"<<endl;
break;
case 4:
cout<<"请输入要删除的元素:"<<endl;
cin>>key;
DeleteBST(T,key);
cout<<"删除成功"<<endl;
break;
case 5:
Print(T);
break;
case 6:
exit(0);
default:
cout<<"输入有误,请重新输入:"<<endl;
}
cout<<"请输入要操作的功能序号:"<<endl;
cin>>n;
}
}。

相关主题