中法122班徐彤坤实验五Word格式文档下载.docx
- 文档编号:21112372
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:16
- 大小:116.41KB
中法122班徐彤坤实验五Word格式文档下载.docx
《中法122班徐彤坤实验五Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《中法122班徐彤坤实验五Word格式文档下载.docx(16页珍藏版)》请在冰豆网上搜索。
1.每个结点都有一个作为搜索依据的关键码(key),所有结点的关键码互不相同;
2.若它的左子树非空,则左子树上所有结点的值均小于根节点的值;
3.若它的右子树非空,则右子树上所有结点的值均大于根节点的值;
4.左右子树本身又各是一棵二叉排序树;
【程序主要部分】
1.插入新结点
intInsertAVL(BSTree&
T,ElemTypee,bool&
taller)
{if(!
T)
{T=(BSTree)malloc(sizeof(BSTnode));
T->
data=e;
lchild=T->
rchild=NULL;
bf=0;
taller=true;
}
2.voidLeftbalance_div(BSTree&
p,int&
shorter)
p结点的左子树高,删除结点后p的bf减1,树变矮;
p结点左、右子树等高,删除结点后p的bf减1,树高不变
p1指向p的右子树,p1结点左、右子树等高,删除结点后p的bf为-2,进行左旋处理,树高不变
p1的右子树高,左旋处理后,树变矮
3.ElemTypeDeleteAVL(BSTree&
p,ElemTypekey,int&
if(LT(key.key,p->
data.key))//在p的左子树中进行删除
if(LQ(key.key,p->
data.key))//在p的右子树中进行删除
【程序源码】
#include<
iostream>
stdlib.h>
string.h>
#defineEQ(a,b)((a)==(b))
#defineLT(a,b)((a)<
(b))
#defineLQ(a,b)((a)>
usingnamespacestd;
typedefintKeytype;
typedefstruct
{Keytypekey;
//关键字域
}ElemType;
typedefstructBSTnode
{ElemTypedata;
intbf;
structBSTnode*lchild,*rchild;
}BSTnode,*BSTree;
voidInitBSTree(BSTree&
{T=NULL;
}
voidR_Rotate(BSTree&
p)
{BSTnode*lc;
lc=p->
lchild;
p->
lchild=lc->
rchild;
lc->
rchild=p;
p=lc;
voidL_Rotate(BSTree&
{BSTnode*rc;
rc=p->
rchild=rc->
rc->
lchild=p;
p=rc;
voidLeftbalance(BSTree&
{BSTnode*lc,*rd;
lc=T->
switch(lc->
bf)
{
case+1:
bf=lc->
R_Rotate(T);
break;
case-1:
rd=lc->
switch(rd->
{case1:
bf=-1;
case0:
bf=1;
rd->
L_Rotate(T->
lchild);
voidRbalance(BSTree&
{BSTnode*lc,*ld;
ld=lc->
switch(ld->
ld->
R_Rotate(T->
rchild);
L_Rotate(T);
else
{if(EQ(e.key,T->
data.key))
{taller=false;
cout<
<
"
结点"
e.key<
不存在。
endl;
return0;
if(LT(e.key,T->
{if(!
InsertAVL(T->
lchild,e,taller))
{return0;
if(taller)
switch(T->
Leftbalance(T);
taller=false;
bf=+1;
rchild,e,taller))
Rbalance(T);
return1;
boolSearchBST(BSTreeT,ElemTypekey,BSTreef,BSTree&
{p=f;
结点不存在。
returnfalse;
elseif(EQ(key.key,T->
data.key))
{p=T;
查找成功,存在结点"
;
p->
data.key<
returntrue;
elseif(LT(key.key,T->
returnSearchBST(T->
lchild,key,T,p);
rchild,key,T,p);
voidLeftbalance_div(BSTree&
{BSTreep1,p2;
if(p->
bf==+1)//p结点的左子树高,删除结点后p的bf减1,树变矮
{p->
shorter=1;
elseif(p->
bf==0)//p结点左、右子树等高,删除结点后p的bf减1,树高不变
shorter=0;
{p1=p->
//p1指向p的右子树
if(p1->
bf==0)//p1结点左、右子树等高,删除结点后p的bf为-2,进行左旋处理,树高不变
{L_Rotate(p);
p1->
elseif(p1->
bf==-1)//p1的右子树高,左旋处理后,树变矮
bf=p->
{p2=p1->
lchild=p2->
p2->
rchild=p1;
rchild=p2->
if(p2->
bf==0)
elseif(p2->
bf==-1)
p=p2;
voidRbalance_div(BSTree&
{R_Rotate(p);
bf==+1)
lchild=p1;
bf==1)
voidDelete(BSTreeq,BSTree&
r,int&
{if(r->
rchild==NULL)
{q->
data=r->
data;
q=r;
r=r->
free(q);
{Delete(q,r->
rchild,shorter);
if(shorter==1)
Rbalance_div(r,shorter);
ElemTypeDeleteAVL(BSTree&
{ElemTypek,a,b;
a.key=1;
b.key=0;
BSTreeq;
if(p==NULL)
{cout<
returnb;
elseif(LT(key.key,p->
{k=DeleteAVL(p->
lchild,key,shorter);
Leftbalance_div(p,shorter);
returnk;
elseif(LQ(key.key,p->
rchild,key,shorter);
Rbalance_div(p,shorter);
q=p;
rchild==NULL)//右子树空则只需重接它的左子树
{p=p->
lchild==NULL)//左子树空则只需重接它的右子树
{Delete(q,q->
lchild,shorter);
p=q;
returna;
voidPrint_BSTTree(BSTreeT,inti)
{if(T)
{if(T->
rchild)
Print_BSTTree(T->
rchild,i+1);
for(intj=1;
j<
=i;
j++)
"
T->
if(T->
lchild)
lchild,i+1);
intmain()
{
中法计122班徐彤坤122930"
BSTreeT;
ElemTypee;
InitBSTree(T);
booltall=false;
boolchoice=true;
chary;
while(choice)
输入要插入结点(数字):
cin>
>
e.key;
InsertAVL(T,e,tall);
Print_BSTTree(T,0);
是否继续,是选y,否选n:
y;
if(y=='
Y'
||y=='
y'
)
choice=true;
elsechoice=false;
BSTreef,p;
输入要查找的结点:
SearchBST(T,e,f,p);
是否继续,是选y,否选n:
intshorter;
输入要删除的结点:
DeleteAVL(T,e,shorter);
【程序运行结果】
【实验总结】
这次数据结构实验课是这个学期最后一个了,做完以后,发现这些算法跟程序在脑海里变得清晰了许多,这次实验课做的课题是实现典型的查找算法,实验的结果全部都在意料之中,不由得松了一口气。
这次数据结构实验课,激发了我对学习的积极性,从程序编写,整理资料到完整运行,最后做调试的过程中,感觉到自己所学习的专业课也并不是那么枯燥乏味。
很小的时候就对计算机很感兴趣,想摸清楚它到底是怎么操作和运行的,如今终于从本质理解了
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中法 122 班徐彤坤 实验
![提示](https://static.bdocx.com/images/bang_tan.gif)