二叉排序树的算法实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

韩山师范学院

实验题目:

二叉排序树的算法实现

班级:2015级软工班作者:黄俊聪

#include

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(keydata)

InsertBST(T->lchild,key);//将*S插入左子树

else if(key>T->data)

InsertBST(T->rchild,key);//将*S插入右子树

}

voidCreatBST(BSTree& T)

{

int key;

T=NULL;//将二叉排序树T初始化为空树

cout<<"请输入元素:"<

cin>>key;

while(key!=ENDFLAG)//ENDFLAG为自定义常亮,作为输入结束标志

{

InsertBST(T,key);//将此结点插入二叉排序树T中

cin>>key;

}

cout<<"创建成功:"<

}

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(keydata)

return SearchBST(T->lchild,key);//在左子树中继续查找else

return SearchBST(T->lchild,key);//在右子树中继续查找

}

void Print(BSTree T)

{

if(T)

{

Print(T->lchild);

cout<<"此时树为:"<data<<" "<

Print(T->rchild);

}

}

int main()

{

BSTree T;

int n;

int key;

cout<<"****1.创建****"<

cout<<"* 2.查找*"<

cout<<"* 3.插入*"<

cout<<"* 4.删除*"<

cout<<"* 5.输出*"<

cout<<"****6.结束****"<

cout<<"请输入要操作的功能序号:"<

cin>>n;

while(1)

{

switch(n)

{

case 1:

CreatBST( T);

break;

case 2:

cout<<"请输入要查找的元素:"<

相关文档
最新文档