第九章查找动态查找表.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
9.2 动态查找表 一、二叉排序树的定义 将线性表构造成二叉排序树的优点: 讨论1:二叉排序树的查找插入算法如何实现? 讨论2:二叉排序树的删除操作如何实现? 难点:*p有两棵子树时,如何进行删除操作? 例:请从下面的二叉排序树中删除结点P。 三、二叉排序树的查找分析 最好情况:与折半查找中的判定树相同(即形态比较均衡) 何谓“平衡二叉树”? 1)LL平衡旋转: 3)LR平衡旋转: * 特点: 一、二叉排序树的定义 二、二叉排序树的插入与删除 三、二叉排序树的查找分析 四、平衡二叉树 表结构在查找过程中动态生成。 要求: 对于给定值key, 若表中存在其关键字等于key的记录,则查找成功返回;否则插入关键字等于key 的记录。 典型的动态表———二叉排序树 ----或是一棵空树;或者是具有如下性质的非空二叉树: (1)左子树的所有结点均小于根的值; (2)右子树的所有结点均大于根的值; (3)它的左右子树也分别为二叉排序树。 (a) (b) 例:下列2种图形中,哪个不是二叉排序树 ? 想一想:对它中序遍历之后是什么效果? 7 4 1 10 2 6 5 3 9 8 5 10 2 1 6 4 7 3 9 8 45 24 53 12 90 如果改变输入顺序为(24,53, 45,45,12,24,90), 查找成功返回 查找成功 例:输入待查找的关键字序列=(45,24,53,45,12,24,90) 查找成功返回 查找成功返回 查找不成功则插入树中 24 53 45 12 90 二、二叉排序树的插入与删除 这种既查找又插入的过程称为动态查找 由一棵空二叉树开始,经过一系列的查找插入操作生成一棵二叉排序树。 ① 查找过程与顺序结构有序表中的折半查找相似,查找效率高; ② 中序遍历此二叉树,将会得到一个关键字的有序序列(即实现了排序运算); ③ 如果查找不成功,能够方便地将被查元素插入到二叉树的叶子结点上,而且插入或删除时只需修改指针而不需移动元素。 二叉排序树既有类似于折半查找的特性,又采用了链式存储,它是动态查找表的一种适宜表示。 思路: 查找不成功,生成一个新结点s,插入到二叉排序树中;查找成功则返回。 SearchInsertBST (K, t) {//K为待查关键字,t为根结点指针 p=t; //p为查找过程中进行扫描的指针 while(p!=NULL){ case { K= p-data: {查找成功,return } K p-data : {q=p;p=p-L_child } //继续向左搜索 K p-data : {q=p;p=p-R_child } //继续向右搜索 } } //查找不成功则插入到二叉排序树中 程序: s =(BiTree)malloc(sizeof(BiTNode)); s-data=K; s -L_child=NULL; s -R_child=NULL; //查找不成功,生成一个新结点s,插入到二叉排序树叶子处 case { t=NULL: t=s; //若t为空,则插入的结点s作为根结点 K q-data: q-L_child=s; //若K比叶子小,挂左边 K q-data: q-R_child=s; //若K比叶子大,挂右边 } return OK } 插入模块(非递归方式)参见教材P228算法9.5(b); 查找模块(递归方式) 参见教材P228算法9.5(a); 以上为查找、插入二合一的非递归程序 和插入相反,删除在查找成功之后进行。删除二叉排序树上一个结点相当于删除有序序列中的一个记录,并且要求在删除树上某个结点之后,仍然保持二叉排序树的特性。 如何删除一个结点? 假设:*p表示被删结点的指针; PL和PR 分别表示*P的左、右孩子指针; *f表示*p的双亲结点指针;并假定*p是*f的左孩子;则可能有三种情况: *p为叶子: 删除此结点时,直接修改*f指针域; *p只有一棵子树(或左或右):令PL或PR为*f的左孩子即可; *p有两棵子树:情况最复杂 → f p PL PR 分析: 设删除前的中序遍历序列为: …. PL s p PR f …. //显然p的直接前驱是s,s是*p左子树最右下方的结点 希望删除p后,其它元素的相对位置不变。有两种解决方法: 法1:令*p的右子树接为*s的右子树,*p的左子树为 *f的左子树,; //即SR=PR ; fL=PL ; 法2:直接令*s代替*p ,再删除原*s// *s为*p左子树最右下方的结点 f p PL PR s F C CL S SL QL P PR Q PR F C CL S SL QL P PR Q 法

文档评论(0)

精品课件 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档