数据结构实验查找算法的实现.docx

上传人:b****3 文档编号:2282797 上传时间:2022-10-28 格式:DOCX 页数:14 大小:33.62KB
下载 相关 举报
数据结构实验查找算法的实现.docx_第1页
第1页 / 共14页
数据结构实验查找算法的实现.docx_第2页
第2页 / 共14页
数据结构实验查找算法的实现.docx_第3页
第3页 / 共14页
数据结构实验查找算法的实现.docx_第4页
第4页 / 共14页
数据结构实验查找算法的实现.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

数据结构实验查找算法的实现.docx

《数据结构实验查找算法的实现.docx》由会员分享,可在线阅读,更多相关《数据结构实验查找算法的实现.docx(14页珍藏版)》请在冰豆网上搜索。

数据结构实验查找算法的实现.docx

数据结构实验查找算法的实现

 

实验五

查找算法实现

 

1、实验目的

熟练掌握顺序查找、折半查找及二叉排序树、平衡二叉树上的查找、插入和删除的方法,比较它们的平均查找长度。

2、问题描述

查找表是数据处理的重要操作,试建立有100个结点的二叉排序树进行查找,然后用原数据建立AVL树,并比较两者的平均查找长度。

3、基本要求

(1)以链表作为存储结构,实现二叉排序树的建立、查找和删除。

(2)根据给定的数据建立平衡二叉树。

4、测试数据

随即生成

5、源程序

#include

#include

#include

#defineEQ(a,b)((a)==(b))

#defineLT(a,b)((a)<(b))

#defineLQ(a,b)((a)>(b))

typedefintKeytype;

typedefstruct

{Keytypekey;//关键字域

}ElemType;

typedefstructBSTnode

{ElemTypedata;

intbf;

structBSTnode*lchild,*rchild;

}BSTnode,*BSTree;

voidInitBSTree(BSTree&T)

{T=NULL;

}

voidR_Rotate(BSTree&p)

{BSTnode*lc;

lc=p->lchild;

p->lchild=lc->rchild;

lc->rchild=p;

p=lc;

}

voidL_Rotate(BSTree&p)

{BSTnode*rc;

rc=p->rchild;

p->rchild=rc->lchild;

rc->lchild=p;

p=rc;

}

voidLeftbalance(BSTree&T)

{BSTnode*lc,*rd;

lc=T->lchild;

switch(lc->bf)

{

case+1:

T->bf=lc->bf=0;

R_Rotate(T);

break;

case-1:

rd=lc->rchild;

switch(rd->bf)

{case1:

T->bf=-1;

lc->bf=0;

break;

case0:

T->bf=lc->bf=0;

break;

case-1:

T->bf=0;

lc->bf=1;

break;

}

rd->bf=0;

L_Rotate(T->lchild);

R_Rotate(T);

}

}

voidRbalance(BSTree&T)

{BSTnode*lc,*ld;

lc=T->rchild;

switch(lc->bf)

{case1:

ld=lc->lchild;

switch(ld->bf)

{case1:

T->bf=0;

lc->bf=-1;

break;

case0:

T->bf=lc->bf=0;

break;

case-1:

T->bf=1;

lc->bf=0;

break;

}

ld->bf=0;

R_Rotate(T->rchild);

L_Rotate(T);

case-1:

T->bf=lc->bf=0;

L_Rotate(T);

break;

}

}

intInsertAVL(BSTree&T,ElemTypee,bool&taller)

{if(!

T)

{T=(BSTree)malloc(sizeof(BSTnode));

T->data=e;

T->lchild=T->rchild=NULL;

T->bf=0;

taller=true;

}

else

{if(EQ(e.key,T->data.key))

{taller=false;

cout<<"结点"<

"<

return0;

}

if(LT(e.key,T->data.key))

{if(!

InsertAVL(T->lchild,e,taller))

{return0;

}

if(taller)

switch(T->bf)

{case1:

Leftbalance(T);

taller=false;

break;

case0:

T->bf=+1;

taller=true;

break;

case-1:

T->bf=0;

taller=false;

break;

}

}

else

{if(!

InsertAVL(T->rchild,e,taller))

{return0;

}

if(taller)

switch(T->bf)

{case1:

T->bf=0;

taller=false;

break;

case0:

T->bf=-1;

taller=true;

break;

case-1:

Rbalance(T);

taller=false;

break;

}

}

}

return1;

}

boolSearchBST(BSTreeT,ElemTypekey,BSTreef,BSTree&p)

{if(!

T)

{p=f;

cout<<"结点不存在。

"<

returnfalse;

}

elseif(EQ(key.key,T->data.key))

{p=T;

cout<<"查找成功,存在结点";

cout<data.key<

returntrue;

}

elseif(LT(key.key,T->data.key))

returnSearchBST(T->lchild,key,T,p);

else

returnSearchBST(T->rchild,key,T,p);

}

voidLeftbalance_div(BSTree&p,int&shorter)

{BSTreep1,p2;

if(p->bf==+1)//p结点的左子树高,删除结点后p的bf减1,树变矮

{p->bf=0;

shorter=1;

}

elseif(p->bf==0)//p结点左、右子树等高,删除结点后p的bf减1,树高不变

{p->bf=-1;

shorter=0;

}

else

{p1=p->rchild;//p1指向p的右子树

if(p1->bf==0)//p1结点左、右子树等高,删除结点后p的bf为-2,进行左旋处理,树高不变

{L_Rotate(p);

p1->bf=1;

p->bf=-1;

shorter=0;

}

elseif(p1->bf==-1)//p1的右子树高,左旋处理后,树变矮

{L_Rotate(p);

p1->bf=p->bf=0;

shorter=1;

}

else

{p2=p1->lchild;

p1->lchild=p2->rchild;

p2->rchild=p1;

p->rchild=p2->lchild;

p2->lchild=p;

if(p2->bf==0)

{p->bf=0;

p1->bf=0;

}

elseif(p2->bf==-1)

{p->bf=+1;

p1->bf=0;

}

else

{p->bf=0;

p1->bf=-1;

}

p2->bf=0;

p=p2;

shorter=1;

}

}

}

voidRbalance_div(BSTree&p,int&shorter)

{BSTreep1,p2;

if(p->bf==-1)

{p->bf=0;

shorter=1;

}

elseif(p->bf==0)

{p->bf=+1;

shorter=0;

}

else

{p1=p->lchild;

if(p1->bf==0)

{R_Rotate(p);

p1->bf=-1;

p->bf=+1;

shorter=0;

}

elseif(p1->bf==+1)

{R_Rotate(p);

p1->bf=p->bf=0;

shorter=1;

}

else

{p2=p1->rchild;

p1->rchild=p2->lchild;

p2->lchild=p1;

p->lchild=p2->rchild;

p2->rchild=p;

if(p2->bf==0)

{p->bf=0;

p1->bf=0;

}

elseif(p2->bf==1)

{p->bf=-1;

p1->bf=0;

}

else

{p->bf=0;

p1->bf=1;

}

p2->bf=0;

p=p2;

shorter=1;

}

}

}

voidDelete(BSTreeq,BSTree&r,int&shorter)

{if(r->rchild==NULL)

{q->data=r->data;

q=r;

r=r->lchild;

free(q);

shorter=1;

}

else

{Delete(q,r->rchild,shorter);

if(shorter==1)

Rbalance_div(r,shorter);

}

}

ElemTypeDeleteAVL(BSTree&p,ElemTypekey,int&shorter)

{ElemTypek,a,b;

a.key=1;

b.key=0;

BSTreeq;

if(p==NULL)

{cout<<"结点不存在。

"<

returnb;

}

elseif(LT(key.key,p->data.key))//在p的左子树中进行删除

{k=DeleteAVL(p->lchild,key,shorter);

if(shorter==1)

Leftbalance_div(p,shorter);

returnk;

}

elseif(LQ(key.key,p->data.key))//在p的右子树中进行删除

{k=DeleteAVL(p->rchild,key,shorter);

if(shorter==1)

Rbalance_div(p,shorter);

returnk;

}

else

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1