第3章--伸展树与跳表.ppt

  1. 1、本文档共27页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第3章--伸展树与跳表

第3章 伸展树与跳表 字典:词条的集合,一种数据结构,主要包括搜索、插入和删除等基本运算。 伸展树和跳表:是表示字典的高级数据结构。 3.1 伸展树 3.1.1 二叉搜索树 1)根的左子树的所有结点的值都小于根结点,右子树的所有结点的值都大于根结点 2)子树也是二叉搜索树 3)用于表示动态集 实现动态集上定义的基本运算 搜索操作 ResultCode Search(K key,T x) const 在集合中搜索关键字为key的元素,若存在,将其值赋值给x,函数返回Success,否则返回NotPresent。 enum ResultCode{Underflow, Overflow, Success, Duplicate, Fail, NotPresent}; 插入操作 ResultCode Insert(T x) 在集合中搜索关键字为x.key的元素,若存在返回Duplicate。否则,若集合已满,返回Overflow,若未满,插入x,返回Success。 删除操作 ResultCode Remove(K key) 在集合中搜索关键字值为key的元素,若存在该元素,则从集合中删除之,并返回Success,否则,返回NotPresent。 二叉平衡树 每次插入或删除后,重新平衡树形,使之始终保持平衡。 能保证性能,但增加了实现难度。 伸展树 自调节搜索树。 在伸展树上,执行一个m次运算(搜索、插入、删除),总的时间为O(mlogn)。(n是树中元素的个数) 具有良好的平均分摊代价。 是平衡搜索树的很好替代结构。 3.1.2 自调节树和伸展树 伸展树: 一颗二叉搜索树,要求每访问一个元素后,将最新访问的元素移至二叉搜索树的根部,以保证经常被访问的元素靠近根结点. 将一个元素移至根部的操作称为一次伸展. 一般情况下,一个元素被访问后,下一次还要访问它的机会比较大. 是自调整搜索树 3.1.3 伸展操作 一棵伸展树是一棵二叉搜索树,其搜索,插入等操作与二叉搜索树相同,只是每次操作后都紧跟一次伸展操作 伸展操作的目的是将结点x移至根结点,被移动的结点为伸展结点. 3.1.3 伸展操作 伸展结点的确定 1.搜索成功的结点 2.新插入的结点 3.被删除结点的双亲 4.若上述运算失败,则搜索过程中遇到的最后一个结点为伸展结点. 3.1.3 伸展操作 一次伸展操作由一组旋转动作组成 单一旋转 3.1.3 伸展操作 单一旋转(zig右旋转)规则 伸展结点的右子树作为其父结点的左子树 伸展结点与其父结点交换位置 左旋转(zag)规则 伸展结点的左子树作为其父结点的右子树 伸展结点与其父结点交换位置 一次伸展操作由一组旋转动作组成 双重旋转 双重旋转 1. zigzig旋转 1 2 p的右子树做g的左子树,然后g做p的右子树; 第1步:将p右旋转(zig)到g,即pg两节点换位; q的右子树做p的左子树,然后p做q的右子树; 第2步:接着将q右旋转到p 双重旋转 2. zigzag旋转 q的左子树做p的右子树,然后p做q的右子树; 第1步:将q左旋转(zag)到p,即pq两节点换位; 第2步: q的右子树做g的左子树,然后g做q的右子树; 1 2 伸展操作既可以自底向上,也可以自顶向下进行. 2 1 1 2 3.1.4 伸展树类 伸展树类 旋转的实现 插入的实现 3.1.4 伸展树类 结点类 templateclass T struct BTNode { //二叉树结点类 T element; BTNode* lChild,*rChild; BTNode(const T x) { element=x; lChild=rChild=NULL; } }; 构造函数 lChild element rChild 伸展树类 templateclass T, class K class SPTree {//伸展树类 public: SPTree(){root=NULL;} ResultCode Insert(T x); ? protected: BTNodeT* root; private: ResultCode Insert(BTNodeT* p, T x); void LRot(BTNodeT* p); void RRot(BTNodeT* p); ? }; 3.1.4旋转函数(左旋转) template class T void SPTreeT::LRot(BTNodeT* p) { //前置条

文档评论(0)

wyjy + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档