第九讲动态搜索-数据结构.pptVIP

  1. 1、本文档共22页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第九讲动态搜索-数据结构

* 计算机科学与技术(本科)专业 ● 二叉搜索树 ● AVL树 §7.3 二叉搜索树(Binary Search Tree) 一、基本概念 1、定义——或是空、或是具有下列性质的二叉树: ? 每个结点有一个作为搜索依据的关键码 ? 左子树上所有关键码小于根结点关键码 ? 右子树上所有关键码大于根结点关键码 2、举例 中序遍历结果: 09,17,23,45,53,65,78,81,87,94 显然中序遍历是有序的,故又称二叉排序树。 53 65 81 87 09 45 23 17 78 94 一、基本概念 3、BST是基于二叉树的动态搜索结构,其删除和插入结点可能要改变树的结构。 4、BST类定义特点 ? 类定义基于二叉链存贮表示 ? 与一般二叉树类定义十分相似 ? 可以继承一般二叉树类的定义 ? 基本运算Find, Insert 和 Remove 都用递归实现所以在类定义中同时包括私有和公用两种性质的声明 二、BST上的搜索 1、基本方法 ? 从根开始将给定值 x 与结点值进行比较 ? 若 x 小,沿着左子树继续搜索 ? 若 x 大,沿着右子树继续搜索 ? 若与 x 等则成功返回结点地址,若为空则失败 2、举例 ? x = 23 53 65 81 87 09 45 23 17 78 94 成功,比较次数为4 ? x = 88 失败,比较次数为4 ? 比较次数不大于 h + 1 3、递归算法 template class Type BStNodeType * BSTType :: Find (Type x, BStNodeType * prt) { //私有函数 if (prt = = NULL) return NULL; else if (x prt - data) return Find (x, prt - leftChild); else if (x prt - data) return Find (x, prt - rightChild); else return prt; } 返回时是返回到上一层调用处的下一条语句去执行 ? 但该算法的递归调用语句都在程序的最尾,称为尾递归 ? 因为是最尾语句,程序结束,不必用栈保存返回地址和 局部变量的值 ? 该算法可以不用栈,采用迭代方法改写成非递归程序 二、BST上的搜索 4、迭代算法 template class Type BStNodeType * BSTType :: Find (Type x, BStNodeType * prt) { if (prt != NULL) { BStNodeType * temp = prt; while (temp != NULL) { if (temp - data = = x) return temp; if (temp - data x) temp = temp - rightChild; else temp = temp - leftChild; }} return NULL; } ? 一般双向尾递归或单向递归的算法,都可利用迭代方 法, 不使用栈将其改为非递归过程 二、BST上的搜索 三、BST中的插入 1、方法 ? 先搜索BST中有无该结点,只有无才插入 ? 插入是作为叶子插入,插入后仍满足BST ? 插入位置应是搜索操作停止(指针ptr为空)的地方 2、算法 template class Type void BSTType :: Insert (const Type x, BStNodeType * ptr) { //私有函数 if (ptr = = NULL) { ptr = new BStNode Type (x);} else if (x ptr - data) Insert (x, ptr - leftChild); else if (x ptr - data) Insert (x, ptr - rightChild); else cout Node existed; } 3、BST的建立 ? 逐次输入关键码序列建一棵BST,是从空开始逐步插入结点 ? 每次从根开始搜索插入位置,然后将新结点作为叶子插入 ? 关键码集合相同但输入序列不同得到的BST也不同 若输入次序: 81 , 65 , 78 , 94 , 87 , 88 , 23 , 45 , 09 , 17 , 53

文档评论(0)

75986597 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档