




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第9章 查找查找的基本概念静态查找表动态查找表哈希表动态查找表 9.2 动态查找表 特点:表结构本身是在查找过程中动态生成的,即对于给定值 key ,若表中存在关键字等于 key 的记录,则查找成功返回;否则,插入关键字等于 key 的记录。 动态查找表 9.2 动态查找表 动态查找表主要有二叉树结构和树结构两种类型。二叉树结构有二叉排序树、平衡二叉树等。树结构有B-树、B+树等。二叉排序树9.2 动态查找表定义:二叉排序树或者是一棵空树;或者是具有如下特性的二叉树: 1)若它的左子树不空,则左子树上所有结点的值均小于根结点的值; 2)若它的右子树不空,则右子树上所有结点的值均大于根结点的值;
2、 3)它的左、右子树也都分别是二叉排序树。 二叉排序树9.2 动态查找表45 12 53 3 37 61 99 24 90 78 caozhaodingchenwang二叉排序树 例: 二叉排序树9.2 动态查找表45 12 53 3 4861 99 24 90 78 caozhaobangchenwang例: 非二叉排序树 48bang二叉排序树的查找算法9.2 动态查找表 若二叉排序树为空,则查找不成功;否则1)若给定值等于根结点的关键字,则查找成功; 2)若给定值小于根结点的关键字,则继续在左子树上进行查找; 3)若给定值大于根结点的关键字,则继续在右子树上进行查找。 二叉排序树9.2
3、动态查找表30802090854035883250查找关键字:50, 35, 90, 95 503590例: 从根结点 出发,沿着左 分支或右分支 逐层向下直至 关键字等于给 定值的结点。 查找成功 从根结点出 发,沿着左分支 或右分支逐层向 下直至指针指向 空树为止。 查找失败二叉排序树的数据类型描述9.2 动态查找表struct BtreeNode ElemType key; /关键字 BtreeNode *lchild, *rchild;/左、右孩子 BtreeNode, *Bitree;二叉排序树的查找算法描述9.2 动态查找表BiTree SearchBST(BiTree T, Ke
4、yType key) /若查找成功,则返回指向该数据元素结点的指针 /否则返回空指针。 if ( (!T) | key = T- data.key ) return(T); else if ( key data.key) return(SearchBST (T- lchild, key); /在左子树中继续查找 else return(SearchBST (T- rchild, key); /在右子树中继续查找 / SearchBST二叉排序树的插入算法9.2 动态查找表1) 若二叉排序树为空树,则新插入的结点为根结点; 2) 若二叉排序树非空,则新插入的结点必为一个新的叶子结 点,并且是查找
5、不成功时查找路径上访问的最后一个结点 的左孩子或右孩子结点。 二叉排序树的插入算法9.2 动态查找表例: 插入 40, 插入 50, 是 37 的右孩子。 是 53 的左孩子。 45 12 53 3 37 61 99 24 90 78 5040二叉排序树的查找算法9.2 动态查找表Status SearchBST (BiTree T, KeyType key, BiTree f, BiTree &p ) /若查找成功,则指针 p 指向该数据元素结点,并返回 TRUE /否则指针 p 指向查找路径上访问的最后一个结点,并返回 FALSE /指针 f 指向 T 的双亲,其初始调用值为NULL。 i
6、f (!T) p = f; return FALSE; / 查找不成功 else if ( key = T- data.key ) p = T; return TRUE; / 查找成功 else if ( key data.key ) SearchBST (T - lchild, key, T, p ); / 在左子树中查找 else SearchBST (T- rchild, key, T, p ); / 在右子树中查找 / SearchBST 二叉排序树的插入算法9.2 动态查找表Status InsertBST(BiTree &T, ElemType e ) / 当二叉排序树 T 中不存
7、在关键字等于 e.key 的数据元素时, / 插入 e 并返回 TRUE,否则返回 FALSE if (!SearchBST ( T, e.key, NULL, p ) / 查找不成功 s = (BiTree) malloc (sizeof (BiTNode); s - data = e; s - lchild = s - rchild = NULL; if ( !p ) T = s; / 插入 s 为新的根结点 else if ( e.key data.key ) p - lchild = s; / 插入 s 为左孩子 else p - rchild = s; / 插入 s 为右孩子 ret
8、urn TRUE; else return FALSE; / 树中已有关键字相同的结点,不再插入 / Insert BST 二叉排序树的生成9.2 动态查找表例:设查找的关键字序列为 45, 24, 53, 45, 12, 24, 90 可生成二叉排序树如下: 从空树开始,经过一系列的查找操作、插入操作之后,可生成一棵二叉排序树。 4553249012二叉排序树的建立9.2 动态查找表例:关键字序列 10、18、3、8、12、2、7、3 生成二叉排序树过程。1018381227注:二叉排序树与关键字排列顺序有关,顺序不同,得到的二叉排序树也不同二叉排序树的建立的算法9.2 动态查找表反复调用二
9、叉排序树的插入算法即可Bitree Creat (int n) /建立含有n个结点的二叉排序树 Bitree T= NULL; for ( int i=1; ix; /输入关键字序列 InsertBST ( T, x); return BST;中序遍历二叉排序树9.2 动态查找表15303778535063902970二叉排序树分析9.2 动态查找表中序遍历二叉排序树可得到一个关键字的有序序列。 一个无序序列可通过构造二叉排序树而变成一个有序序列。构造树的过程就是对无序序列进行排序的过程。 插入的结点均为叶子结点,故无需移动其他结点。相当于在有序序列上插入记录而无需移动其他记录。 二叉排序树上
10、的删除9.2 动态查找表 对于二叉排序树,删去树上一个结点相当于删去有序序列中的一个记录,在删除某个结点之后依旧要保持二叉排序树的特性。如何在二叉排序树上删去一个结点呢? 二叉排序树上的删除9.2 动态查找表分三种情况进行讨论: (1)若*p结点为叶子结点,即PL和PR均为空树。 由于删去叶子结点不破坏整棵树的结构,则只需修改其双亲结点的指针。 (2)若*p结点只有左子树PL或者只有右子树PR。 只需令PL或PR直接成为其双亲结点*f的左子树即可。(3)若*p结点的左子树和右子树均不空。 二叉排序树上的删除9.2 动态查找表2)P只有左子树或右子树: P只有左子树,用P的左孩子代替P; SPP
11、LQSPLQSPPLQSPLQ二叉排序树上的删除9.2 动态查找表2)P只有左子树或右子树: P只有右子树,用P的右孩子代替P; SPPRQSPRQSPPRQSPRQ二叉排序树上的删除9.2 动态查找表3)P左、右子树均非空 用P的直接前驱(或直接后继)取代PFPCDAQBSCGEPACBQCSPEDGF中序遍历从小到大排列ACBQCSPEDGF二叉排序树上的删除9.2 动态查找表3)P左、右子树均非空 用P的直接前驱(或直接后继)取代PFPCDAQBSCGEPFPCDAQBCGESS二叉排序树上的删除9.2 动态查找表3)P左、右子树均非空 用P的直接前驱(或直接后继)取代PFPCDAQBS
12、CGEPFPCDAQBGEESC二叉排序树的删除算法9.2 动态查找表Status DeleteBST(BiTree &T, KeyType key) if(!T) return FALSE; /不存在关键字等于key的数据元素 else if EQ(key, T-key) return Delete(T); /查找成功 else if LT(key,T-key) return DeleteBST (T-lchild,key); else return DeleteBST (T-rchild,key); /DelectBST二叉排序树的删除算法9.2 动态查找表Status Delete (B
13、iTree &p) if(!p-rchild) /右子树空则只需重接它的左子树 q=p; p=p-lchild; free(q); else if (!p-lchild) /左子树空则只需重接它的右子树 q=p; p=p-rchild; free(q); else q=p; s=p-lchild; while (s-rchild) q=s; s=s-lchild; /转左,然后向右到尽头 p-data=s-data; if(q!=p) q-rchild=s-lchild; else q-lchild=s-lchild; delete s; Return TRUE; /delete二叉排序树的查
14、找分析 9.2 动态查找表二叉排序树上查找某关键字等于给定值的结点过程,其实就是走了一条从根到该结点的路径。 30802090854035883250查找关键字:35 35比较的关键字次数 此结点所在层次数 最多的比较次数 树的深度 = = 二叉排序树的平均查找长度9.2 动态查找表452412375393(45, 24, 53, 12, 37, 93) 534512243793折半查找判定树 二叉排序树 二叉排序树的平均查找长度9.2 动态查找表(12, 24, 37, 45, 53, 93) 371245245393452412375393折半查找判定树 二叉排序树 含有 n 个结点的二叉
15、排序树的平均查找长度和树的形态有关 二叉排序树的查找分析 9.2 动态查找表最坏情况:插入的 n 个元素从一开始就有序, 变成单支树的形态! 此时树的深度为 n; ASL = (n + 1) / 2 查找效率与顺序查找情况相同。 最好情况: ASL=log 2(n + 1) 1; 树的深度为:log 2n + 1; 与折半查找中的判定树相同。 (形态比较均衡)。 452412375393452412375393二叉排序树的查找分析 9.2 动态查找表 设每种树态出现概率相同,查找每个关键字也是等概率的,则有 n 个关键字的二叉排序树的平均查找长度 由此可见,在随机的情况下,二叉排序树的ASL和
16、logn是等数量级的。 问题:如何提高形态不均衡的二叉排序树的查找效率? 平衡二叉树 解决办法:做“平衡化”处理,即尽量让二叉树的形状均衡! 平衡二叉树9.2 动态查找表 平衡二叉树又称 AVL树,它是具有如下性质的二叉树: 即: |左子树深度右子树深度| 1左、右子树是平衡二叉树;所有结点的左、右子树深度之差的绝对值 1。 例:判断下列二叉树是否 AVL 树? 9.2 动态查找表非平衡二叉树 1-100-110平衡二叉树 0012-10平衡二叉树9.2 动态查找表 为了方便起见,给每个结点附加一个数字, 数字=该结点左子树与右子树的深度差。这个数字称为结点的平衡因子。这样就可得到AVL树的其
17、它性质任一结点的平衡因子只能取:-1、0 或 1;如果树中任意一个结点的平衡因子的绝对值大于 1,则这棵二叉树就失去平衡。 对于一棵有 n 个结点的 AVL 树,其深度和 log n 同数量级, ASL 也和 log n 同数量级。 平衡二叉树9.2 动态查找表 如果在一棵AVL树中插入一个新结点,就有可能造成失衡,此时必须重新调整树的结构,使之恢复平衡。我们称调整平衡过程为平衡旋转。平衡旋转可以归纳为四类: LL平衡旋转 RR平衡旋转 LR平衡旋转 RL平衡旋转平衡二叉树9.2 动态查找表 如果在一棵AVL树中插入一个新结点,就有可能造成失衡,此时必须重新调整树的结构,使之恢复平衡。我们称调
18、整平衡过程为平衡旋转。平衡旋转可以归纳为四类: LL平衡旋转 RR平衡旋转 LR平衡旋转 RL平衡旋转平衡二叉树9.2 动态查找表若在 A 的左子树的左子树上插入 结点,使 A 的平衡因子从 1 增加 至 2, 需要进行一次顺时针旋转。 (以 B 为旋转轴) 1) LL 平衡旋转: CBAA平衡二叉树9.2 动态查找表若在 A 的右子树的右子树上插入 结点,使 A 的平衡因子从 -1 改变为 -2,需要进行一次逆时针旋转。(以 B 为旋转轴)2) RR 平衡旋转: CBAA平衡二叉树9.2 动态查找表若在 A 的左子树的右子树上插入 结点,使 A 的平衡因子从 1 增加 至 2, 需要先进行逆时针旋转, 再顺时针旋转。 (以插入的结点 B 为旋转轴) 3) LR 平衡旋转: CBAB平衡二叉树9.2 动态查找表若在 A 的左子树的右子树上插入 结点,使 A 的平衡因子从 1 增加 至 2, 需要先进行逆时针旋转, 再顺时针旋转。 (以插入的结点 B 为旋转轴) 3) LR 平衡旋转: ACBBA平衡二叉树9.2 动态查找表若在 A 的右子树的左子树上插入 结点,使 A 的平衡因子从 -1 改变 为 -2,需要先进行顺时针旋转,再逆时
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2030年中国深圳市服装行业发展监测及市场发展潜力预测报告
- 护士企业编制面试题库含答案详解(突破训练)
- 押题宝典期货从业资格之《期货法律法规》模考模拟试题及参考答案详解
- 2025年度汽车金融贷款授信合同借款
- 2025年体育场馆汽车停车位租赁与赛事服务合同
- 2025版私家车买卖合同及车辆上牌服务协议
- 2025大闸蟹加盟店产品研发合同范本大全
- 2025版电商品牌授权代理销售合同书
- 2025版水电站工程监理合同书
- 2025年智慧社区房产代理销售服务合同
- 2025年期货高管考试题库及答案
- 2024年黑龙江省肇源县卫生系统招聘考试(护理学专业知识)题含答案
- 2025年小学生“学宪法讲宪法”活动知识竞赛题库含答案
- 2025年江苏省南京市中考英语试卷
- 2025年内蒙古中考物理试卷(含答案)
- 村卫生室医疗安全管理
- 2025小学生“学宪法、讲宪法”网络知识竞赛题库及答案
- 云南省曲靖市2025年八年级下学期语文期末考试卷及答案
- 2025至2030中国汽车金融行业市场深度分析及竞争格局与发展前景展望报告
- 脊柱内镜手术机器人系统设计与精准位置控制研究
- 白酒生产技术课件
评论
0/150
提交评论