实习六平衡二叉树.docx
- 文档编号:26551841
- 上传时间:2023-06-20
- 格式:DOCX
- 页数:16
- 大小:107.73KB
实习六平衡二叉树.docx
《实习六平衡二叉树.docx》由会员分享,可在线阅读,更多相关《实习六平衡二叉树.docx(16页珍藏版)》请在冰豆网上搜索。
实习六平衡二叉树
实习六:
平衡二叉树
实验报告
题目:
平衡二叉树操作的演示
一.需求分析
利用平衡二叉树实现一个动态查找表。
实现动态查找表的三种基本功能:
查找、插入和删除。
测试数据:
13,24,37,90,53
二.详细设计
#include
#include
#include
#include
#include
#defineSUCCESS0
#defineERROR-1
#definemax(a,b)((a)>(b)?
(a):
(b))
#defineNOT_FOUND1
usingnamespacestd;
typedefintStatus;
typedefstruct_AVL
{
intdata,count;
inth;
struct_AVL*lch,*rch;
StatusInit(intd)
{
data=d;
h=count=1;
lch=rch=NULL;
returnSUCCESS;
}
}AVL,*PAVL;
intGetHeight(PAVLp)
{
if(p==NULL)
return0;
returnp->h;
}
voidUpdateHeight(PAVL&p)
{
p->h=max(GetHeight(p->lch),GetHeight(p->rch))+1;
}
voidL_Rotate(PAVL&p)
{
if(p->rch!
=NULL)
{
PAVLtmp=p->rch;
p->rch=tmp->lch;
tmp->lch=p;
p=tmp;
UpdateHeight(p->lch);
UpdateHeight(p);
}
}
voidR_Rotate(PAVL&p)
{
if(p->lch!
=NULL)
{
PAVLtmp=p->lch;
p->lch=tmp->rch;
tmp->rch=p;
p=tmp;
UpdateHeight(p->rch);
UpdateHeight(p);
}
}
voidRightBalance(PAVL&p)
{
if(p!
=NULL)
if(GetHeight(p->rch)-GetHeight(p->lch)>1)//左旋
{
if(GetHeight(p->rch->lch)>GetHeight(p->rch->rch))//双旋
R_Rotate(p->rch);
L_Rotate(p);
}
}
voidLeftBalance(PAVL&p)
{
if(p!
=NULL)
if(GetHeight(p->lch)-GetHeight(p->rch)>1)//右旋
{
if(GetHeight(p->lch->rch)>GetHeight(p->lch->lch))//双旋
L_Rotate(p->lch);
R_Rotate(p);
}
}
StatusAVLInsert(PAVL&p,intelem)
{
if(p==NULL)
{
p=newAVL;
if(!
p)
returnERROR;
p->Init(elem);
returnSUCCESS;
}
else
{
if(elem>p->data)
{
if(AVLInsert(p->rch,elem)==ERROR)
returnERROR;
RightBalance(p);
}
elseif(elem
{
if(AVLInsert(p->lch,elem)==ERROR)
returnERROR;
LeftBalance(p);
}
else
p->count++;
}
UpdateHeight(p);
returnSUCCESS;
}
PAVLFindSuccession(PAVL&p)
{
PAVLr=p;
if(p->lch!
=NULL)
{
r=FindSuccession(p->lch);
UpdateHeight(p);
RightBalance(p);
}
else
p=p->rch;
returnr;
}
StatusAVLDelete(PAVL&p,intelem)
{
Statusstatus=SUCCESS;
if(NULL==p)
returnNOT_FOUND;
if(elem>p->data)
{
status=AVLDelete(p->rch,elem);
if(status==SUCCESS)
{
UpdateHeight(p);
LeftBalance(p);
}
}
elseif(elem
{
status=AVLDelete(p->lch,elem);
if(status==SUCCESS)
{
UpdateHeight(p);
RightBalance(p);
}
}
else//找到待删除元素
{
if(p->lch!
=NULL&&p->rch!
=NULL)
{
PAVLsucc=FindSuccession(p->rch);//寻找后继结点
PAVLtmp=p;
succ->lch=p->lch;
succ->rch=p->rch;
p=succ;//移动后继结点到当前结点
UpdateHeight(p);
deletetmp;
}
else
{
if(p->lch!
=NULL)
p=p->lch;
else
p=p->rch;
}
LeftBalance(p);
}
returnstatus;
}
StatusAVLFind(PAVLT,intelem,int&depth)
{
depth=1;
while(T!
=NULL)
{
if(elem>T->data)
T=T->rch;
elseif(elem
T=T->lch;
else
returnSUCCESS;
depth++;
}
returnNOT_FOUND;
}
intMsg()
{
intr;
cout<<"*****************************"< cout<<"*1.插入元素*"< cout<<"*2.删除元素*"< cout<<"*3.查找元素*"< cout<<"*0.退出程序*"< cout<<"*****************************"< cout<<"请选择: "; cin>>r; returnr; } voidprint_proc(PAVLT,int&now,intdepth,intm[][100]) { if(NULL==T) return; print_proc(T->rch,now,depth+1,m); m[now++][depth]=T->data; print_proc(T->lch,now,depth+1,m); } voidprint_avl(PAVLT) { intm[100][100],num=0; memset(m,0xFF,sizeof(m)); print_proc(T,num,0,m); for(inti=0;;i++) { intlev_num=0; for(intj=0;j if(m[i][j]! =-1) { lev_num++; printf("%3d",m[i][j]); } else printf(""); printf("\n"); if(lev_num==0) break; } } voidcmd_insert(PAVL&T) { intd; cout<<"输入待插入的元素值: "; cin>>d; if(AVLInsert(T,d)==ERROR) cout<<"插入元素失败! "< else { cout<<"插入元素成功! "< print_avl(T); } } voidcmd_delete(PAVL&T) { intd,status; cout<<"输入待删除的元素值: "; cin>>d; status=AVLDelete(T,d); switch(status) { caseSUCCESS: cout<<"删除元素成功! "< print_avl(T); break; caseNOT_FOUND: cout<<"没有找到输入的元素"< break; caseERROR: cout<<"删除元素失败! "< break; } } voidcmd_find(PAVL&T) { intd,status,depth; cout<<"输入待查找的元素值: "; cin>>d; status=AVLFind(T,d,depth); switch(status) { caseSUCCESS: cout<<"在深度"< "< break; caseNOT_FOUND: cout<<"没有找到输入的元素"< break; caseERROR: cout<<"查找元素失败! "< break; } } intmain() { intcmd; PAVLavl=NULL; while((cmd=Msg())) { switch(cmd) { case1: cmd_insert(avl); break; case2: cmd_delete(avl); break; case3: cmd_find(avl); break; default: cout<<"指令错误! "< break; } } return0; } 测试结果
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实习 平衡 二叉