当前课程知识点:数据结构(下) > 第七章 二叉搜索树 > (b1)BST:查找 > 07B1-2 查找:算法
作为最基本的操作接口
首当其冲自然是查找
那么如何在一棵BST中
查找特定的关键码呢?
我们来看一个具体的实例
首先你不妨暂停一下
按照上节所推荐的方法验证
这的确是一棵BST
每一次查找都是从根节点开始的
假设我们要查找22
那么首先将目标关键码22
与根节点处所对应的关键码16
做一比较
不难看出
22相对于16更大
那么这样一个判断结果
意味着什么呢?
你应该还记得
BST所处处具有的顺序性
是的 对于根节点而言
它的左后代都不可能比它更大
而当前的查找目标
却比它更大
这就意味着根节点的
整棵左子树都可以被忽略掉
反过来 如果树中
的确存有目标关键码22
那么它也必然位于右子树中
因此接下来 我们将相应地
转入这棵右子树
具体地 也就是将控制权
交给这棵子树的树根25
同样地
每当进入一棵子树
我们都要将目标关键码
与当前的子树根节点进行比较
经过这次比较我们发现
目标关键码22
相对于子树根节点要更小
那么这意味着什么呢?
同样地 根据顺序性
节点25的所有右后代
都不会比25小
都不可能等于目标关键码22
因此这些节点同样可以被忽略掉
反过来 如果目标关键码
的确存在于这棵子树中
那么它也只能存在于其中的左子树中
这也就是为什么
我们接下来要顺藤摸瓜
转入25的左子树
也就是将控制权
交给这棵子树的根节点19
在进入这棵子树之后
我们同样要将目标关键码22
与这棵子树的树根19进行比较
并可以相应地忽略掉
它的所有左后代
虽然现在只有一个
而将查找的范围缩小到
这个根节点的右子树
最后一步
在相应地进入到这棵右子树之后
我们同样要将这棵子树的根节点22
与目标节点进行比较
并终于发现二者相等
至此 这次查找
也就相应地以成功而告终
现在请你留意观察
在下方列出的这样一个序列
你应该看得出来
这就是这棵BST的中序遍历序列
好的
现在你假想地认为
它就是一个向量
当然根据全局的单调性
它必然是一个有序向量
以下我们将重放一遍
在这棵BST中刚才的搜索过程
我们不妨一起来体味一下
这样一个搜索的过程
在下方的有序向量中
对应于怎样的一个过程
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)概述
--07A-1 纵览
--07A-5 接口
-(a)概述--作业
-(b1)BST:查找
-第七章 二叉搜索树--(b1)BST:查找
-(b2)BST:插入
-(b2)BST:插入--作业
-(b3)BST:删除
-第七章 二叉搜索树--(b3)BST:删除
-(c)平衡与等价
-(c)平衡与等价--作业
-(d1)AVL树:重平衡
-第七章 二叉搜索树--(d1)AVL树:重平衡
-(d2)AVL树:插入
-(d2)AVL树:插入--作业
-(d3)AVL树:删除
-(d3)AVL树:删除--作业
-(d4)AVL树:(3+4)-重构
-(d4)AVL树:(3+4)-重构--作业
-本章测验
--章节测验
-(a1)伸展树:逐层伸展
--习题
-(a2)伸展树:双层伸展
--习题
-(a3)伸展树:算法实现
--习题
-(b1)B-树:动机
--习题
-(b2)B-树:结构
--习题
-(b3)B-树:查找
--习题
-(b4)B-树: 插入
--习题
-(b5)B-树: 删除
--习题
-(xa1)红黑树:动机
--习题
-(xa2)红黑树:结构
--习题
-(xa3)红黑树:插入
--习题
-(xa4)红黑树:删除
-本章测验
--习题
-(b)散列:原理
--09B-3 数组
--09B-4 原理
--09B-5 散列
--09B-6 冲突
--习题
-(c)散列:散列函数
--习题
-(d1)散列:排解冲突(1)
--习题
-(d2)散列:排解冲突(2)
--习题
-(e)桶/计数排序
--习题
-本章测验
--本章测试
-(a1)需求与动机
--习题
-(a2)基本实现
--习题
-(b1)完全二叉堆:结构
--习题
-(b2)完全二叉堆:插入与上滤
--习题
-(b3)完全二叉堆:删除与下滤
--习题
-(b4)完全二叉堆:批量建堆
--习题
-(c)堆排序
--习题
-(xa1)左式堆:结构
--习题
-(xa2)左式堆:合并
--习题
-(xa3)左式堆:插入与删除
-本章测验
--本章测试
-(a)ADT
--习题
-(b1)串匹配
--习题
-(b2)蛮力匹配
--习题
-(c1)KMP算法:从记忆力到预知力
--习题
-(c2)KMP算法:查询表
--习题
-(c3)KMP算法:理解next[]表
--习题
-(c4)KMP算法:构造next[]表
--习题
-(c5)KMP算法:分摊分析
--习题
-(c6)KMP算法:再改进
-(d1)BM_BC算法:以终为始
-(d2)BM_BC算法:坏字符
-(d3)BM_BC算法:构造bc[]
-(d4)BM_BC算法:性能分析
-(e1)BM_GS算法:好后缀
-(e2)BM_GS算法:构造gs表
-(e3)BM_GS算法:综合性能
-(f1)Karp-Rabin算法:串即是数
-(f2)Karp-Rabin算法:散列
-本章测验
--本章测试
-(a1)快速排序:算法A
-- 12a1-5: 实例
--习题
-(a2)快速排序:性能分析
--习题
-(a4)快速排序:变种
-(b1)选取:众数
-(b3)选取:通用算法
--习题
-(c1) 希尔排序:Shell序列
--习题
-(c2)希尔排序:逆序对
-本章测验
--本章测试