- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
BST实验报告
问题描述
利用二叉查找树(BST)实现一个动态查找表
基本要求
使用二叉树(BST)来实现。
二叉树使用链式结构(二叉链表)实现。
实现BST的构建,查找两个功能。
一 需求分析
1.输入的形式:输入要存储元素的个数n(正整数),n个元素的值(设为整数)和要查找元素的值;
2.输出的形式:输出是否找到(查找成功\不成功)和查找时比较的次数(正整数);
3.程序所能达到的功能:要求输入用户设定个元素,再输入要查找的元素,输出是否找到和查找时比较的次数;
4、测试数据
输入:
5//BST的节点数
请输入数据:43 54 32 12 57 //五个数据
请输入查找数:54 //查找54
输出:查找成功 2 //返回成功和查找时比较的次数
请输入查找数:12 //查找12
输出:查找成功 3 //返回成功和查找时比较的次数
请输入查找的数: 50 //查找50
输出:查找不成功 3 //返回成功和查找时比较的次数
二 概要设计
抽象数据类型的定义
BST,二叉查找树,先定义一个二叉树节点,然后实现二叉查找树的功能。
数据对象:整数
数据关系:数据元素属于同一集合,是二叉树,如果对其做中序遍历呈递增序列
基本操作:遍历,二叉树的构建,查找,插入
算法的基本思想
将输入的BST的元素用插入的方法存进BST中(由于BST中任何结点的左孩子小于该节点,右孩子大于该节点,所以用递归方法比较插入)。判断输入要查找的元素是否在BST中(递归比较要查找的元素与当前元素的值的大小,若小于当前值,则查找其左子树;若大于,则查找其右子树),若在,则输出位置;若不在,则插入到BST中,并输出其位置
程序的流程:
程序由三个模块组成:
(1)输入模块:输入二叉查找树的元素个数、元素的值,以及要查找的数
(2)查找模块:判断该元素是否在二叉查找树中,若未找到,则插入到二叉查找树中。
(3)输出模块:输出是否找到。若找到,则输出位置;若未找到,则输出插入的位置。
三 详细设计
(1)物理数据类型
因为要实现一个动态查找表,对一个数进行查找,用线性表实现所用的时间代价比较高,而用二叉查找表来实现的话时间代价显剧较低,故可以构建一个二叉查找树,来实现动态查找。
(2)算法的具体步骤
BST的构建伪代码为:
初始化BST,调用插入函数,用for循环使得输入的元素一个一个以插入的形式存入BST中
BSTree InitBST(int n)
{ //输入一个结点序列,建立一棵二叉排序树,将根结点指针返回
BSTree T=NULL; //初始时T为空树
int key;
for(int i=0;in;i++)
{ cinkey;//读入一个关键字
InsertBST(T,key); //将key插入二叉排序树T
}//存入n个元素到BST中
return T; //返回建立的二叉排序树的根指针
} //BSTree
2、BST的查找设计和伪代码为:
若BST为空或者要查找的元素就是BST当前的元素值key,返回该树,即若T为空,查找失败;否则成功,返回找到的结点位置;
若输入的查找元素小于BST当前的元素值,则以递归的形式在左子树中继续查找;
若输入的查找元素大于BST当前的元素值,则以递归的形式在右子树中继续查找。
BSTNode *SearchBST(BSTree T,int key)
{ //在二叉排序树T上查找关键字为key的结点,成功时返回该结点位置,否则返回NULL
if(T==NULL||key==T-key) //递归的终结条件
{
return T; //T为空,查找失败;否则成功,返回找到的结点位置
}
if(keyT-key)
return SearchBST(T-lchild,key);//在左子树中查找
else
return SearchBST(T-rchild,key);//继续在右子树中查找
} //SearchBST
3、BST的插入伪代码:
定义BST临时指针p和temp;P指向T,构建temp,使得其根节点值为要查找的元素,左右孩子为空。
若要查找的BST为空,则插入元素为根节点;
若要插入的元素小于当前元素,则被插结点为左孩子,返回TRUE;
若要插入的元素大于当前元素,则被插结点为右孩子,返回TRUE。
Status insertBST(BSTree T, int e)
{
BSTree *p = NULL, *temp = NULL;
temp = (B STree *)malloc(sizeof(BSTree));
文档评论(0)