- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构试验五
查找算法实现
姓名:徐彤坤
学号:122930
班级:中法计122班
【实验目的】
熟练掌握顺序查找、折半查找及二叉排序树、平衡二叉树上的查找、插入和删除的方法,比较它们的平均查找长度。
【问题描述】
查找表是数据处理的重要操作, 试建立有100个结点的二叉排序树进行查找,然后用原数据建立AVL树, 并比较两者的平均查找长度。
【基本要求】
以链表作为存储结构,实现二叉排序树的建立、查找和删除。
根据给定的数据建立平衡二叉树。
比较二叉排序树和平衡二叉树的平均查找长度。
【测试数据】
随机生成。
【实现提示】
初始,二叉排序树和平衡二叉树都为空树,操作界面给出查找、插入和删除三种操作供选择。每种操作均要提示输入关键字。每次插入或删除一个结点后,应更新平衡二叉树或二叉排序树的显示。
平衡二叉树或二叉排序树的显示可以采用凹入表形式,也可以采用图形界面画出树形。
【算法思想】
二叉树的定义:二叉排序树或者是一颗空树,或者是一颗具有如下特性的二叉树:
每个结点都有一个作为搜索依据的关键码(key),所有结点的关键码互不相同;
若它的左子树非空,则左子树上所有结点的值均小于根节点的值;
若它的右子树非空,则右子树上所有结点的值均大于根节点的值;
左右子树本身又各是一棵二叉排序树;
【程序主要部分】
1.插入新结点
int InsertAVL(BSTree T,ElemType e,bool taller)
{ if(!T)
{ T=(BSTree)malloc(sizeof(BSTnode));
T-data=e;
T-lchild=T-rchild=NULL;
T-bf=0;
taller=true;
}
void Leftbalance_div(BSTree p,int shorter)
p结点的左子树高,删除结点后p的bf减1,树变矮;
p结点左、右子树等高,删除结点后p的bf减1,树高不变
p1指向p的右子树,p1结点左、右子树等高,删除结点后p的bf为-2,进行左旋处理,树高不变
p1的右子树高,左旋处理后,树变矮
ElemType DeleteAVL(BSTree p,ElemType key,int shorter)
if(LT(key.key,p-data.key) )//在p的左子树中进行删除
if(LQ(key.key,p-data.key) )//在p的右子树中进行删除
【程序源码】
#includeiostream
#includestdlib.h
#includestring.h
#define EQ(a,b) ((a)==(b))
#define LT(a,b) ((a)(b))
#define LQ(a,b) ((a)(b))
using namespace std;
typedef int Keytype;
typedef struct
{ Keytype key; //关键字域
}ElemType;
typedef struct BSTnode
{ ElemType data;
int bf;
struct BSTnode *lchild,*rchild;
}BSTnode,*BSTree;
void InitBSTree(BSTree T)
{T=NULL;
}
void R_Rotate(BSTree p)
{BSTnode *lc;
lc=p-lchild;
p-lchild=lc-rchild;
lc-rchild=p;
p=lc;
}
void L_Rotate(BSTree p)
{BSTnode *rc;
rc=p-rchild;
p-rchild=rc-lchild;
rc-lchild=p;
p=rc;
}
void Leftbalance(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)
{ case 1:
T-bf=-1;
lc-bf=0;
break;
case 0:
T-bf=lc-bf=0;
break;
case -1:
T-bf=0;
lc-bf=1;
文档评论(0)