欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    数据结构实验三BST动态查找表.docx

    • 资源ID:2824916       资源大小:362.67KB        全文页数:26页
    • 资源格式: DOCX        下载积分:3金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    数据结构实验三BST动态查找表.docx

    1、数据结构实验三BST动态查找表HUNAN UNIVERSITY课程实习报告题 目: BST实现动态查找表学生姓名: 学生学号: 专业班级: 指导老师: 李晓鸿 完成日期: 2015 11 21 一、需求分析 1、程序任务:本程序是利用二叉查找树(BST)来实现;二叉树使用链式结构(二叉链表)实现,本程序要实现BST的构建,查找BST树中元素中两个功能。2、输入形式:输入整数n/BST的节点个数n。 输入n个数,其取值范围为(0, 216),对非法输入做处理。 3、输出形式: 若查找成功 整数m(次数)/返回成功和查找时比较的次数若查找不成功 整数m(次数) /返回不成功和查找时比较的次数若输入

    2、错误 “输入了无效的元素”4、测试数据: .正常的输入10 /BST的节点个数 50 1 3 2 78 65 100 59 43 18 /10个数据输入:50 输出:查找成功,查找次数1 输入:1输出:查找成功,查找次数6输入:3 输出:查找成功,查找次数4输入:100 输出:查找成功,查找次数5输入:19输出:查找失败只有左子树的情况10 /BST的节点个数 100 1 12 35 43 95 54 82 78 93 /10个数据输入:1 输出:查找成功,查找次数1 输入:12输出:查找成功,查找次数6输入:35 输出:查找成功,查找次数4输入:95 输出:查找成功,查找次数5输入:19输出

    3、:查找失败错误的节点数输入-2 /BST的节点个数输出:错误的结点数输入错误的结点值的输入(字母)10 /BST的结点个数 1 q 2 3 4 5 6 7 8 9 /10个数据 输出:无效的结点输入错误的结点值的输入(负数)10 /BST的结点个数 1 -2 2 3 4 5 6 7 8 9 /10个数据 输出:无效的结点输入二叉树中任意结点的值大于左节点的值,小于右节点的值,满足BST树的性质,所以用BST树来实现。二概要设计1.抽象数据类型 二叉树中任意结点的值大于左节点的值,小于右节点的值,满足BST树的性质,同时本题在建树时需要大量的插入操作,运用链式结构比较方便,所以用链式结构的二叉树

    4、来满足BST树的构建。 2.ADT二叉树的ADT: 数据对象D:D是BinNode类的数据元素的集合数据关系R:若D为空集,则称为空树 。否则: (1) 在D中存在唯一的称为根的数据元素root; (2) 当n1时,其余结点可分为m (m0)个互不相交的有限集T1, T2, , Tm,其中每一棵子集本身又是一棵符合本定义的树,称为根root的子树。 基本操作: bool InitBST(BST *b) /初始化二叉树 bool InitBSTNode(BSTNode * &n)/初始化节点bool clearBST(BSTNode * &n) /销毁BST结点的ADT数据对象:包含结点的值,同

    5、时包含结点的左右指针数据关系:每个结点都有各自的值 若结点左右指针为空,则该节点称为叶子结点基本操作:/结点的初始化BinNodePtr()lc=rc=NULLBinNodePtr(Elem e,BinNodePtr* l=NULL;BinNodePtr* r=NULL)it=e;lc=l;rc=r;/判断是否是叶子结点bool isleaf()return(lc=NULL)&(rc=NULL);3.算法的基本思想 构建BST树:输入节点数后,依次输入每个结点的值,将第一个结点作为根结点,插入一个数,这个数与根节点先比较,若小于则再与根结点的左子树相比较,若大于则与根节点的右子树相比较。比较时

    6、,若小于根结点且根结点的左子树为空,则这个数为根结点左子树的值,若小于根结点又大于根结点的左子树,则运用指针将根结点的左指针指向这个值得地址,这个值地址的指针再指向原来根结点左子树;大于的情况同理。 查找:设置一个计数器,每查找一次则加一。从根节点开始,在BST中检索值K。如果根节点存储的值为K,则检索结束。如果不是,必须检索数的更深的一层。BST的效率在于只需检索两棵子树之一。如果K小于根节点的值,则只需检索左子树;若果K结点大于根结点的值,则检索右子树。这个过程一直持续到K被知道或者遇到一个叶子结点为止。如果叶子结点仍没有发现K,那么K就不在BST中。4.程序的流程程序由三个模块组成:输入

    7、模块:输入结点数目初始数据,构建二叉查找树查找模块:判断需要查找的值是否在该BST中输出模块:输出查找成功与否,并输出比较的次数3、详细设计1.物理数据类型动态查找表的数据为小数或整数,用float类型保存。树的ADT具体实现/初始化二叉树 bool InitBST(BST *b) b-root = NULL; return true; /销毁BSTbool clearBST(BSTNode * &n) if (n) return false; if (n-lchild) clearBST(n-lchild); if (n-rchild) clearBST(n-rchild); free(n)

    8、; return true;/初始化节点bool InitBSTNode(BSTNode * &n) n = (BSTNode *)malloc(sizeof(BSTNode); n-lchild = NULL; n-rchild = NULL; return true;结点的ADT具体实现BinNodePtr()lc=rc=NULL/结点的初始化BinNodePtr(Elem e,BinNodePtr* l=NULL;BinNodePtr* r=NULL)it=e;lc=l;rc=r;/判断是否是叶子结点bool isleaf()2.算法的具体步骤结点输入操作:先输入结点数,在输入每个结点的

    9、值,通过循环调用insert函数将每个结点进行插入cout BST结点数目: n;for (int i = 0; i pi; if (pi = 0) cout 无效的结点输入 root = NULL) b-root = n; return true; 之后结点的插入:插入一个数,这个数与根结点先比较,若小于则再与根结点的左子树相比较,若大于则与根节点的右子树相比较。比较时,若小于根结点且根结点的左子树为空,则这个数为根结点左子树的值,若小于根结点又大于根结点的左子树,则运用指针将根结点的左指针指向这个值得地址,这个值地址的指针再指向原来根结点左子树;大于的情况同理。while (1)/循环比较

    10、 if (edata)/小于根节点则插入左子树 if (m-lchild = NULL) m-lchild = n;/给左孩子赋值 return true; if (m-lchild != NULL&em-lchild-data) n-lchild = m-lchild; m-lchild = n; return true; else m = m-lchild; continue; else/大于根节点则插入右子树 if (m-rchild = NULL) m-rchild = n; /给右孩子赋值 return true; if (m-rchild != NULL&erchild-data)

    11、 n-rchild = m-rchild; m-rchild = n; return true; else m = m-rchild; continue; 完整的insert插入操作:插入元素e时,先判断该二叉树是否为空,若为空,将e作为该二叉树的根节点。否则,从根节点开始,比较e与节点n的大小。如果e的值更小,判断n的左子树是否为空,若为空,将e作为节点n的左孩子并返回e,否则比较e与n左孩子的值,依此循环下去;如果e的值更大,判断n的右子树是否为空,若为空,将e作为节点n的右孩子并返回e,否则比较e与n右孩子的值,依此循环下去。bool insert(BST *b, ElemType e)

    12、/把结点插入BST BSTNode *n, *m; InitBSTNode(n); n-data = e; if (b-root = NULL) b-root = n; return true; m = b-root; while (1)/循环比较 if (edata)/小于根节点则插入左子树 if (m-lchild = NULL) m-lchild = n;/给左孩子赋值 return true; if (m-lchild != NULL&em-lchild-data) n-lchild = m-lchild; m-lchild = n; return true; else m = m-l

    13、child; continue; else/大于根节点则插入右子树 if (m-rchild = NULL) m-rchild = n; /给右孩子赋值 return true; if (m-rchild != NULL&erchild-data) n-rchild = m-rchild; m-rchild = n; return true; else m = m-rchild;continue;find查找操作,查找元素时,从根节点开始,比较e与节点x的大小,若相等,返回true;如果e比节点x的值小,判断x的左子树是否为空,若为空,返回false,不为空则比较e与x左孩子的值,依次循环下去

    14、;如果e比节点x的值大,判断x的右子树是否为空,若为空,返回false,不为空则比较e与x右孩子的值,依次循环下去。bool find(BST *b, ElemType e) /查询元素e,记录比较的次数查询成功返回true,否则返回false int count = 0; BSTNode *x = b-root; while (1)/循环比较 count+;/设置计数器 if (edata)/小于根节点则在左子树中查找 if (x-lchild = NULL) cout 查找失败,查找次数: count lchild;/继续与左孩子的值比较 continue; if (ex-data) /大

    15、于根节点则在右子树中查找 if (x-rchild = NULL) cout 查找失败,查找次数: count rchild;/继续与右孩子的值比较 continue; if (e = x-data) cout 查找成功,查找次数: count endl; /cout count; return true; 3.算法的时空分析 查找元素需要的比较次数由树的深度决定查找,最好时间复杂度O(logN),最坏时间复杂度O(N)(只有左子树或右子树的情况)。4.输入和输出的格式输入BST结点数BST结点数目: /等待输入 cout BST结点数: n;输入BST结点数据BST节点数据: /等待输入fo

    16、r (int i = 0; i pi; if (pi = 0) cout 无效的结点输入 endl; system(pause); return; 输入要查找的数据 cout 输入要查找的数据(输入-1结束查找) m;若BST结点数目输入错误:输出 “无效的结点数目输入”if (n = 0) cout 无效的结点数目输入 endl; system(pause); return; 若BST节点数据输入错误:输出 “无效的结点输入”if (pi = 0) cout 无效的结点输入 data) cout 查找成功,查找次数: count rchild = NULL) cout 查找失败,查找次数:

    17、count endl; return false;/右子树为空则查找失败 四调试分析 1.本程序会将第一个输入的值作为root,如果第一个值输入过大,导致所有数据都被存放进左子树,导致树的长度n过长,接下来的查找效率过低,因为最好在输入前就大致考虑一下中间值是多少,尽量避免树过长。 2.一开始insert函数并没有考虑太多,后来发现再输入节点的值时有限制,必须输入比之前输入所有节点值的最小值还小,或者比之前输入最大值还要大。举例 输入3142,此程序生成的树为 3 / 1 4,此时insert(2)只能接在1后面,错误,错误结果如下经过修改,3的左指针指向2,2的左指针指向15测试结果第一组:

    18、输入节点数10节点数据 50 1 3 2 78 65 100 59 43 18结果正确第二组:结果正确第三组:结果正确第四组:结果正确第五组:结果正确6、用户使用说明本程序会将第一个数作为root,所以输入前大致想好范围,第一个数尽量输入中间值,可以减少查找的时间复杂度7试验心得1.试验刚开始考虑过先将输入的数进行排序,后来觉得冒泡排序对时间复杂度的影响是O(n2),远大于查找最大时间O(n ),于是放弃,本程序通过BST树,极大的优化了时间复杂度,数据结构的魅力也就在此。2.由于对时间复杂度的不满意,查阅了有关最优二叉查找树资料3.动态规划方法生成最优二叉查找树 (参考CSDN) 基于统计先

    19、验知识,我们可统计出一个数表(集合)中各元素的查找概率,理解为集合各元素的出现频率。比如中文输入法字库中各词条(单字、词组等)的先验概率,针对用户习惯可以自动调整词频所谓动态调频、高频先现原则,以减少用户翻查次数。这就是最优二叉查找树问题:查找过程中键值比较次数最少,或者说希望用最少的键值比较次数找到每个关键码(键值)。为解决这样的问题,显然需要对集合的每个元素赋予一个特殊属性查找概率。这样我们就需要构造一颗最优二叉查找树。n个键a1,a2,a3.an,其相应的查找概率为p1,p2,p3.pn。构成最优BST,表示为T1n ,求这棵树的平均查找次数C1, n(耗费最低)。换言之,如何构造这棵最

    20、优BST,使得C1, n 最小。动态规划法策略是将问题分成多个阶段,逐段推进计算,后继实例解由其直接前趋实例解计算得到。对于最优BST问题,利用减一技术和最优性原则,如果前n-1个节点构成最优BST,加入一个节点an后要求构成规模n的最优BST。按 n-1, n-2 , . , 2, 1 递归,问题可解。自底向上计算:C1, 2?C1, 3 ?. ?C1, n。为不失一般性用Ci, j 表示由a1,a2,a3.an构成的BST的耗费。其中1=i =j =n。这棵树表示为Tij。从中选择一个键ak作根节点,它的左子树为Tik-1,右子树为Tk+1j。要求选择的k 使得整棵树的平均查找次数Ci,

    21、j最小。左右子树递归执行此过程。(根的生成过程)递推计算式基本算法8附录#include#includeusing namespace std;#includealgorithmtypedef float ElemType;typedef struct BSTNode ElemType data; struct BSTNode *lchild, *rchild;BSTNode;typedef struct BST BSTNode *root;BST;bool InitBST(BST *b) /初始化二叉树 b-root = NULL; return true;bool InitBSTNode(

    22、BSTNode * &n) /初始化节点 n = (BSTNode *)malloc(sizeof(BSTNode); n-lchild = NULL; n-rchild = NULL; return true;bool clearBST(BSTNode * &n) /销毁BST if (n) return false; if (n-lchild) clearBST(n-lchild); if (n-rchild) clearBST(n-rchild); free(n); return true;bool insert(BST *b, ElemType e)/把结点插入BST BSTNode

    23、*n, *m; InitBSTNode(n); n-data = e; if (b-root = NULL) b-root = n; return true; m = b-root; while (1)/循环比较 if (edata)/小于根节点则插入左子树 if (m-lchild = NULL) m-lchild = n;/给左孩子赋值 return true; if (m-lchild != NULL&em-lchild-data) n-lchild = m-lchild; m-lchild = n; return true; else m = m-lchild; continue; e

    24、lse/大于根节点则插入右子树 if (m-rchild = NULL) m-rchild = n; /给右孩子赋值 return true; if (m-rchild != NULL&erchild-data) n-rchild = m-rchild; m-rchild = n; return true; else m = m-rchild; continue; bool find(BST *b, ElemType e) /查询元素e,记录比较的次数查询成功返回true,否则返回false int count = 0; BSTNode *x = b-root; while (1)/循环比较

    25、count+;/设置计数器 if (edata)/小于根节点则在左子树中查找 if (x-lchild = NULL) cout 查找失败,查找次数: count lchild;/继续与左孩子的值比较 continue; if (ex-data) /大于根节点则在右子树中查找 if (x-rchild = NULL) cout 查找失败,查找次数: count rchild;/继续与右孩子的值比较 continue; if (e = x-data) cout 查找成功,查找次数: count endl; /cout count; return true; void main() int n, m = 0, count; BST b; InitBST(&b);


    注意事项

    本文(数据结构实验三BST动态查找表.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开