二叉排序树的算法实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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(key
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(key return SearchBST(T->lchild,key);//在左子树中继续查找else return SearchBST(T->lchild,key);//在右子树中继续查找 } void Print(BSTree T) { if(T) { Print(T->lchild); cout<<"此时树为:"< 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<<"请输入要查找的元素:"<