二叉搜索树(BinarySearchTree).

合集下载

动态规划-最优二叉搜索树

动态规划-最优二叉搜索树

动态规划-最优⼆叉搜索树摘要: 本章介绍了⼆叉查找树的概念及操作。

主要内容包括⼆叉查找树的性质,如何在⼆叉查找树中查找最⼤值、最⼩值和给定的值,如何找出某⼀个元素的前驱和后继,如何在⼆叉查找树中进⾏插⼊和删除操作。

在⼆叉查找树上执⾏这些基本操作的时间与树的⾼度成正⽐,⼀棵随机构造的⼆叉查找树的期望⾼度为O(lgn),从⽽基本动态集合的操作平均时间为θ(lgn)。

1、⼆叉查找树 ⼆叉查找树是按照⼆叉树结构来组织的,因此可以⽤⼆叉链表结构表⽰。

⼆叉查找树中的关键字的存储⽅式满⾜的特征是:设x为⼆叉查找树中的⼀个结点。

如果y是x的左⼦树中的⼀个结点,则key[y]≤key[x]。

如果y是x的右⼦树中的⼀个结点,则key[x]≤key[y]。

根据⼆叉查找树的特征可知,采⽤中根遍历⼀棵⼆叉查找树,可以得到树中关键字有⼩到⼤的序列。

介绍了⼆叉树概念及其遍历。

⼀棵⼆叉树查找及其中根遍历结果如下图所⽰:书中给出了⼀个定理:如果x是⼀棵包含n个结点的⼦树的根,则其中根遍历运⾏时间为θ(n)。

问题:⼆叉查找树性质与最⼩堆之间有什么区别?能否利⽤最⼩堆的性质在O(n)时间内,按序输出含有n个结点的树中的所有关键字?2、查询⼆叉查找树 ⼆叉查找树中最常见的操作是查找树中的某个关键字,除了基本的查询,还⽀持最⼤值、最⼩值、前驱和后继查询操作,书中就每种查询进⾏了详细的讲解。

(1)查找SEARCH 在⼆叉查找树中查找⼀个给定的关键字k的过程与⼆分查找很类似,根据⼆叉查找树在的关键字存放的特征,很容易得出查找过程:⾸先是关键字k与树根的关键字进⾏⽐较,如果k⼤⽐根的关键字⼤,则在根的右⼦树中查找,否则在根的左⼦树中查找,重复此过程,直到找到与遇到空结点为⽌。

例如下图所⽰的查找关键字13的过程:(查找过程每次在左右⼦树中做出选择,减少⼀半的⼯作量)书中给出了查找过程的递归和⾮递归形式的伪代码:1 TREE_SEARCH(x,k)2 if x=NULL or k=key[x]3 then return x4 if(k<key[x])5 then return TREE_SEARCH(left[x],k)6 else7 then return TREE_SEARCH(right[x],k)1 ITERATIVE_TREE_SEARCH(x,k)2 while x!=NULL and k!=key[x]3 do if k<key[x]4 then x=left[x]5 else6 then x=right[x]7 return x(2)查找最⼤关键字和最⼩关键字 根据⼆叉查找树的特征,很容易查找出最⼤和最⼩关键字。

二叉排序树

二叉排序树

二叉排序树1.二叉排序树定义二叉排序树(Binary Sort Tree)或者是一棵空树;或者是具有下列性质的二叉树:(1)若左子树不空,则左子树上所有结点的值均小于根结点的值;若右子树不空,则右子树上所有结点的值均大于根结点的值。

(2)左右子树也都是二叉排序树,如图6-2所示。

2.二叉排序树的查找过程由其定义可见,二叉排序树的查找过程为:(1)若查找树为空,查找失败。

(2)查找树非空,将给定值key与查找树的根结点关键码比较。

(3)若相等,查找成功,结束查找过程,否则:①当给值key小于根结点关键码,查找将在以左孩子为根的子树上继续进行,转(1)。

②当给值key大于根结点关键码,查找将在以右孩子为根的子树上继续进行,转(1)。

3.二叉排序树插入操作和构造一棵二叉排序树向二叉排序树中插入一个结点的过程:设待插入结点的关键码为key,为将其插入,先要在二叉排序树中进行查找,若查找成功,按二叉排序树定义,该插入结点已存在,不用插入;查找不成功时,则插入之。

因此,新插入结点一定是作为叶子结点添加上去的。

构造一棵二叉排序树则是逐个插入结点的过程。

对于关键码序列为:{63,90,70,55,67,42,98,83,10,45,58},则构造一棵二叉排序树的过程如图6-3所示。

4.二叉排序树删除操作从二叉排序树中删除一个结点之后,要求其仍能保持二叉排序树的特性。

设待删结点为*p(p为指向待删结点的指针),其双亲结点为*f,删除可以分三种情况,如图6-4所示。

(1)*p结点为叶结点,由于删去叶结点后不影响整棵树的特性,所以,只需将被删结点的双亲结点相应指针域改为空指针,如图6-4(a)所示。

(2)*p结点只有右子树或只有左子树,此时,只需将或替换*f结点的*p子树即可,如图6-4(b)、(c)所示。

(3)*p结点既有左子树又有右子树,可按中序遍历保持有序地进行调整,如图6-4(d)、(e)所示。

设删除*p结点前,中序遍历序列为:① P为F的左子女时有:…,Pi子树,P,Pj,S子树,Pk,Sk子树,…,P2,S2子树,P1,S1子树,F,…。

2024年研究生考试考研计算机学科专业基础(408)试卷与参考答案

2024年研究生考试考研计算机学科专业基础(408)试卷与参考答案

2024年研究生考试考研计算机学科专业基础(408)自测试卷(答案在后面)一、单项选择题(本大题有40小题,每小题2分,共80分)1、在计算机网络中,TCP协议工作在哪一层?A. 物理层B. 数据链路层C. 网络层D. 传输层2、假设有一个采用补码表示的8位寄存器,如果该寄存器的内容是10000000,则其对应的十进制数值是多少?A. -127B. -128C. 0D. 1283、以下哪项不是数据库事务应满足的ACID特性之一?A. 原子性B. 一致性C. 隔离性D. 持久性E. 可用性4、在计算机系统中,以下哪种存储器属于随机存取存储器(RAM)?A、只读存储器(ROM)B、光盘存储器C、硬盘存储器D、动态随机存取存储器(DRAM)5、下列哪个选项描述了编译器的功能?A、将汇编语言翻译成机器语言B、将高级语言翻译成机器语言C、将机器语言翻译成高级语言D、将二进制代码转换成源代码6、在数据结构中,以下哪种数据结构可以实现高效的查找操作?A、链表B、数组C、栈D、哈希表7、在下列寻址方式中,哪种寻址方式需要两次访问内存?A. 直接寻址B. 立即数寻址C. 寄存器间接寻址D. 基址变址寻址8、设有3个作业J1、J2、J3,它们的到达时间和运行时间如下表所示。

若采用短作业优先(SJF)调度算法,则这3个作业的平均等待时间是多少?作业到达时间运行时间J106J224J342A. 6B. 8C. 10D. 129、下面关于虚拟存储器的说法,哪个是正确的?A. 虚拟存储器允许程序访问比主存更大的地址空间。

B. 虚拟存储器可以完全避免碎片问题。

C. 虚拟存储器的实现不需要硬件支持。

D. 虚拟存储器中所有页面都在内存中。

10、计算机网络的OSI七层模型中,负责处理数据传输的层次是:A. 应用层B. 表示层C. 会话层D. 传输层13、在某计算机系统中,若一个文件的物理结构采用链接结构存储,则下列说法正确的是:A. 适合于随机存取B. 存储空间利用率高,但不支持随机访问C. 不利于文件长度动态增长D. 文件的逻辑记录不必连续存放16、在计算机科学中,下列哪个术语描述了一个由有限个状态组成的模型,用于描述有限个输入的序列,并产生输出?A. 有限自动机B. 状态机C. 数据结构D. 程序19、关于操作系统中的进程状态转换,以下哪个选项是正确的?A. 进程从就绪状态直接转换为阻塞状态B. 进程从运行状态直接转换为就绪状态C. 进程从阻塞状态直接转换为运行状态D. 进程从创建状态直接转换为运行状态22、在计算机科学中,以下哪种排序算法的平均时间复杂度是O(nlogn)?A. 冒泡排序B. 快速排序C. 插入排序D. 选择排序25、在计算机系统中,以下哪个设备通常用于存储大量数据?A. 硬盘驱动器(HDD)B. 光驱C. 显卡D. CPU28、以下关于C++中虚函数和纯虚函数的说法,正确的是()A. 虚函数一定有函数体,纯虚函数必须有函数体B. 纯虚函数可以出现在类中,但不能被实例化C. 虚函数只能在派生类中重写,纯虚函数只能在基类中重写D. 虚函数和纯虚函数都是成员函数,都可以在类定义中给出函数体31、在计算机网络中,以下哪个协议是用于传输电子邮件的?A. HTTPB. FTPC. SMTPD. TCP34、以下关于数据结构中二叉搜索树的描述,错误的是:A. 二叉搜索树是一种特殊的二叉树,其中每个节点都有一个关键字。

算法设计与分析复习题目及答案 (3)

算法设计与分析复习题目及答案 (3)

分治法1、二分搜索算法是利用(分治策略)实现的算法。

9. 实现循环赛日程表利用的算法是(分治策略)27、Strassen矩阵乘法是利用(分治策略)实现的算法。

34.实现合并排序利用的算法是(分治策略)。

实现大整数的乘法是利用的算法(分治策略)。

17.实现棋盘覆盖算法利用的算法是(分治法)。

29、使用分治法求解不需要满足的条件是(子问题必须是一样的)。

不可以使用分治法求解的是(0/1背包问题)。

动态规划下列不是动态规划算法基本步骤的是(构造最优解)下列是动态规划算法基本要素的是(子问题重叠性质)。

下列算法中通常以自底向上的方式求解最优解的是(动态规划法)备忘录方法是那种算法的变形。

(动态规划法)最长公共子序列算法利用的算法是(动态规划法)。

矩阵连乘问题的算法可由(动态规划算法B)设计实现。

实现最大子段和利用的算法是(动态规划法)。

贪心算法能解决的问题:单源最短路径问题,最小花费生成树问题,背包问题,活动安排问题,不能解决的问题:N皇后问题,0/1背包问题是贪心算法的基本要素的是(贪心选择性质和最优子结构性质)。

回溯法回溯法解旅行售货员问题时的解空间树是(排列树)。

剪枝函数是回溯法中为避免无效搜索采取的策略回溯法的效率不依赖于下列哪些因素(确定解空间的时间)分支限界法最大效益优先是(分支界限法)的一搜索方式。

分支限界法解最大团问题时,活结点表的组织形式是(最大堆)。

分支限界法解旅行售货员问题时,活结点表的组织形式是(最小堆)优先队列式分支限界法选取扩展结点的原则是(结点的优先级)在对问题的解空间树进行搜索的方法中,一个活结点最多有一次机会成为活结点的是( 分支限界法).从活结点表中选择下一个扩展结点的不同方式将导致不同的分支限界法,以下除( 栈式分支限界法)之外都是最常见的方式.(1)队列式(FIFO)分支限界法:按照队列先进先出(FIFO)原则选取下一个节点为扩展节点。

(2)优先队列式分支限界法:按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。

数据结构之二叉树(BinaryTree)

数据结构之二叉树(BinaryTree)

数据结构之⼆叉树(BinaryTree)⽬录导读 ⼆叉树是⼀种很常见的数据结构,但要注意的是,⼆叉树并不是树的特殊情况,⼆叉树与树是两种不⼀样的数据结构。

⽬录 ⼀、⼆叉树的定义 ⼆、⼆叉树为何不是特殊的树 三、⼆叉树的五种基本形态 四、⼆叉树相关术语 五、⼆叉树的主要性质(6个) 六、⼆叉树的存储结构(2种) 七、⼆叉树的遍历算法(4种) ⼋、⼆叉树的基本应⽤:⼆叉排序树、平衡⼆叉树、赫夫曼树及赫夫曼编码⼀、⼆叉树的定义 如果你知道树的定义(有限个结点组成的具有层次关系的集合),那么就很好理解⼆叉树了。

定义:⼆叉树是n(n≥0)个结点的有限集,⼆叉树是每个结点最多有两个⼦树的树结构,它由⼀个根结点及左⼦树和右⼦树组成。

(这⾥的左⼦树和右⼦树也是⼆叉树)。

值得注意的是,⼆叉树和“度⾄多为2的有序树”⼏乎⼀样,但,⼆叉树不是树的特殊情形。

具体分析如下⼆、⼆叉树为何不是特殊的树 1、⼆叉树与⽆序树不同 ⼆叉树的⼦树有左右之分,不能颠倒。

⽆序树的⼦树⽆左右之分。

2、⼆叉树与有序树也不同(关键) 当有序树有两个⼦树时,确实可以看做⼀颗⼆叉树,但当只有⼀个⼦树时,就没有了左右之分,如图所⽰:三、⼆叉树的五种基本状态四、⼆叉树相关术语是满⼆叉树;⽽国际定义为,不存在度为1的结点,即结点的度要么为2要么为0,这样的⼆叉树就称为满⼆叉树。

这两种概念完全不同,既然在国内,我们就默认第⼀种定义就好)。

完全⼆叉树:如果将⼀颗深度为K的⼆叉树按从上到下、从左到右的顺序进⾏编号,如果各结点的编号与深度为K的满⼆叉树相同位置的编号完全对应,那么这就是⼀颗完全⼆叉树。

如图所⽰:五、⼆叉树的主要性质 ⼆叉树的性质是基于它的结构⽽得来的,这些性质不必死记,使⽤到再查询或者⾃⼰根据⼆叉树结构进⾏推理即可。

性质1:⾮空⼆叉树的叶⼦结点数等于双分⽀结点数加1。

证明:设⼆叉树的叶⼦结点数为X,单分⽀结点数为Y,双分⽀结点数为Z。

Java常见的七种查找算法

Java常见的七种查找算法

Java常见的七种查找算法1. 基本查找也叫做顺序查找,说明:顺序查找适合于存储结构为数组或者链表。

基本思想:顺序查找也称为线形查找,属于无序查找算法。

从数据结构线的一端开始,顺序扫描,依次将遍历到的结点与要查找的值相比较,若相等则表示查找成功;若遍历结束仍没有找到相同的,表示查找失败。

示例代码:public class A01_BasicSearchDemo1 {public static void main(String[] args){//基本查找/顺序查找//核心://从0索引开始挨个往后查找//需求:定义一个方法利用基本查找,查询某个元素是否存在//数据如下:{131, 127, 147, 81, 103, 23, 7, 79}int[] arr ={131,127,147,81,103,23,7,79};int number =82;System.out.println(basicSearch(arr, number));}//参数://一:数组//二:要查找的元素//返回值://元素是否存在public static boolean basicSearch(int[] arr,int number){//利用基本查找来查找number在数组中是否存在for(int i =0; i < arr.length; i++){if(arr[i]== number){return true;}}return false;}}2. 二分查找也叫做折半查找,说明:元素必须是有序的,从小到大,或者从大到小都是可以的。

如果是无序的,也可以先进行排序。

但是排序之后,会改变原有数据的顺序,查找出来元素位置跟原来的元素可能是不一样的,所以排序之后再查找只能判断当前数据是否在容器当中,返回的索引无实际的意义。

基本思想:也称为是折半查找,属于有序查找算法。

用给定值先与中间结点比较。

比较完之后有三种情况:•相等说明找到了•要查找的数据比中间节点小说明要查找的数字在中间节点左边•要查找的数据比中间节点大说明要查找的数字在中间节点右边代码示例:package com.itheima.search;public class A02_BinarySearchDemo1 {public static void main(String[] args){//二分查找/折半查找//核心://每次排除一半的查找范围//需求:定义一个方法利用二分查找,查询某个元素在数组中的索引//数据如下:{7, 23, 79, 81, 103, 127, 131, 147}int[] arr ={7,23,79,81,103,127,131,147};System.out.println(binarySearch(arr,150));}public static int binarySearch(int[] arr,int number){//1.定义两个变量记录要查找的范围int min =0;int max = arr.length-1;//2.利用循环不断的去找要查找的数据while(true){if(min > max){return-1;}//3.找到min和max的中间位置int mid =(min + max)/2;//4.拿着mid指向的元素跟要查找的元素进行比较if(arr[mid]> number){//4.1 number在mid的左边//min不变,max = mid - 1;max = mid -1;}else if(arr[mid]< number){//4.2 number在mid的右边//max不变,min = mid + 1;min = mid +1;}else{//4.3 number跟mid指向的元素一样//找到了return mid;}}}}3. 插值查找在介绍插值查找之前,先考虑一个问题:为什么二分查找算法一定要是折半,而不是折四分之一或者折更多呢?其实就是因为方便,简单,但是如果我能在二分查找的基础上,让中间的mid点,尽可能靠近想要查找的元素,那不就能提高查找的效率了吗?二分查找中查找点计算如下:mid=(low+high)/2, 即mid=low+1/2*(high-low);我们可以将查找的点改进为如下:mid=low+(key-a[low])/(a[high]-a[low])*(high-low),这样,让mid值的变化更靠近关键字key,这样也就间接地减少了比较次数。

18个查找函数

18个查找函数

18个查找函数查找函数是计算机编程中常用的工具之一,用于在给定数据集中快速找到目标元素。

这些函数广泛应用于各种编程语言和领域,包括数据处理、数据库查询、图形算法等。

本文将介绍18个常见的查找函数,并逐步回答与之相关的问题。

1. 线性查找(Linear Search)线性查找是最简单的一种查找方法,它逐个地比较目标元素与数据集中的每个元素,直到找到目标或遍历完整个数据集。

但是,线性查找的时间复杂度较高,适用于小规模数据集或未排序的数据。

问题1:线性查找的时间复杂度是多少?答:线性查找的时间复杂度为O(n),其中n是数据集的大小。

2. 二分查找(Binary Search)二分查找是一种高效的查找算法,要求数据集必须是有序的。

它通过将数据集分成两半,并与目标元素进行比较,从而逐步缩小查找范围。

每次比较都可以将查找范围缩小一半,因此该算法的时间复杂度较低。

问题2:二分查找要求数据集必须是有序的吗?答:是的,二分查找要求数据集必须是有序的,这是保证算法正确性的前提。

3. 插值查找(Interpolation Search)插值查找是对二分查找的改进,它根据目标元素与数据集中最大和最小元素的关系,估算目标所在位置,并逐步逼近目标。

这种方法在被查找的数据集分布较为均匀时能够显著提高查找效率。

问题3:何时应该使用插值查找而不是二分查找?答:当被查找的数据集分布较为均匀时,插值查找能够提供更好的性能。

而对于分布不均匀的数据集,二分查找可能更适用。

4. 斐波那契查找(Fibonacci Search)斐波那契查找是一种利用斐波那契数列的性质进行查找的算法。

它类似于二分查找,但将查找范围按照斐波那契数列进行划分。

这种方法在数据集较大时能够降低比较次数,提高查找效率。

问题4:为什么使用斐波那契数列进行划分?答:斐波那契数列具有递增的性质,能够将查找范围按照黄金分割比例进行划分,使得划分后的两部分大小接近,提高了查找的效率。

二叉树算法的应用领域

二叉树算法的应用领域

二叉树算法的应用领域
二叉树算法在计算机科学和相关领域中有广泛的应用。

以下是一些常见的应用领域:
1. 数据库系统:二叉树被广泛用于数据库系统中的索引结构,如二叉搜索树(Binary Search Tree,BST)和平衡二叉树(如AVL树、红黑树)等,以提高数据的检索效率。

2. 文件系统:用于文件系统的目录结构,如B树和B+树,能够高效地组织和管理文件系统中的数据。

3. 编译器:语法分析阶段使用语法树(也是一种树结构)来表示源代码的语法结构,其中二叉树是语法树的一种常见形式。

4. 网络路由:路由表中的路由信息通常使用树状结构,如二叉树,以便高效地搜索和决定数据包的路由。

5. 图形学:在计算机图形学中,二叉树可以用于场景图(Scene Graph)的表示,用于管理和渲染三维场景中的对象。

6. 人工智能:决策树是一种特殊的二叉树,广泛应用于机器学习和数据挖掘中的分类和决策问题。

7. 操作系统:进程调度和资源管理中可能使用树结构来组织和管理进程。

8. 游戏开发:在游戏中,空间分区树(如四叉树和八叉树)常用于加速空间查询和碰撞检测。

9. 密码学:Merkle树是一种二叉树结构,被广泛用于区块链中的交易验证和Merkle证明。

10. 网络和通信:Huffman编码树用于数据压缩,而霍夫曼解码树用于解压缩。

这只是二叉树算法应用的一小部分。

它们在计算机科学的各个领域中都发挥着关键的作用,提高了数据结构和算法的效率和性能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。


在插入之前,先使用搜索算法在树中检查要 插入的元素在不在树中。 如果搜索成功,说明树中已经有这个元素, 不再插入; 如果搜索不成功,说明树中原来没有关键 码等于给定值的结点,把新元素加到搜索 操作停止的地方。
9
二叉搜索树的插入

每次结点的插入,都要 从根结点出发搜索插入 位置,然后把新结点作 为叶结点插入。
6
BSTNode *Search (T x, BSTNode * subtree) { // 迭代算法:在当前以 subtree 为根的二叉搜索 // 树中搜索含 x 的结点。若找到,则函数返回该 // 结点的地址,否则函数返回 NULL 值。 while (subtree != NULL) { if (x == subtree->data) return subtree; if (x < subtree->data) subtree = subtree->left; else subtree = subtree->right; } return NULL; }
3

二叉搜索树的搜索算法



在二叉搜索树上进行搜索,是一个从根结点开 始,沿某一个分支逐层向下进行比较判等的过 程。它可以是一个递归的过程。 假设想要在二叉搜索树中搜索关键码为 x 的元 素,搜索过程从根结点开始。 如果根指针为NULL,则搜索不成功;否则用 给定值 x 与根结点的关键码进行比较: 若给定值等于根结点关键码,则搜索成功, 返回搜索成功信息并报告搜索到结点地址。
二叉搜索树 ( Binary Search Tree )

定义 二叉搜索树或者是一棵空树,或者是具 有下列性质的二叉树: 每个结点都有一个作为搜索依据的关键 码(key),所有结点的关键码互不相同。 左子树(如果非空)上所有结点的关键 码都小于根结点的关键码。 右子树(如果非空)上所有结点的关键 码都大于根结点的关键码。 左子树和右子树也是二叉搜索树。
4
若给定值小于根结点的关键码,则继续 递归搜索根结点的左子树; 否则。递归搜索根结点的右子树。 搜索28
35
搜索45
45
搜索失败
10
15
25 20 40 30
搜索成功505源自BSTNode *Search (T x, BSTNode *subtree) { // 递归算法:在以 subtree 为根的二叉搜索树中 // 搜索含 x 的结点。若找到,则函数返回该结点 // 的地址,否则函数返回 NULL 值。 if (subtree == NULL) return NULL; else if (x < subtree->data) return Search(x, subtree->left); else if (x > subtree->data) return Search(x, subtree->right); else return subtree; // 搜索成功 }
14
二叉搜索树的删除算法


在二叉搜索树中删除一个结点时,必须将因 删除结点而断开的二叉链表重新链接起来, 同时确保二叉搜索树的性质不会失去。 为保证在删除后树的搜索性能不至于降低, 还需要防止重新链接后树的高度增加。 删除叶结点,只需将其双亲结点指向它的 指针清零,再释放它即可。 被删结点右子树为空,可以拿它的左子女 结点顶替它的位置,再释放它。
35
15 10 25 40 45 50
20
30
28
插入新结点 28
10
二叉搜索树的插入算法
bool Insert (T e, BSTNode &subtree) { // 递归算法:在以 subtree 为根的二叉搜索树中插入 // 值为 e 的结点。若树中已有结点 e,则不插入 if (subtree == NULL) { // 新结点作为叶结点插入 subtree = new BSTNode(e); // 创建新结点 return true; } else if (e < subtree->data) Insert (e, subtree->left); else if (e > subtree->data) Insert (e, subtree->right); };
53
78
65
65
65
78 87
87
81
15
81
13
void createBST (T EndValue) { // 从键盘上输入元素序列, 建立一棵二叉搜索树, // 参数 EndValue 表示序列的结束符 root = NULL; // root 为树根,初始化为空树 cin >> x; //输入数据 while ( x.key != EndValue) { // RefValue是一个输入结束标志 Insert (x, root); cin >> x; // 插入,再输入数据 } }
11

注意参数表中引用型指针参数subtree的
使用。

利用二叉搜索树的插入算法,可以很方
便地建立二叉搜索树。
12
输入数据 { 53, 78, 65, 17, 87, 09, 81, 15 }
53 53
78 53 17 09 65 78 87 09
53
78 17 53 17 65 78
53
78 17 53 17 87 09 65
7



搜索过程是从根结点开始,沿某条路径自上而 下逐层比较判等的过程。 搜索成功,搜索指针将停留在树上某个结点; 搜索不成功,搜索指针将走到树上某个结点的 空子树。 设树的高度为 h,最多比较次数不超过 h。
8
二叉搜索树的插入算法

为了向二叉搜索树中插入一个新元素,必须 先检查这个元素是否在树中已经存在。
1
二叉搜索树例

35 15 10 20 25 40 30 45 50
结点左子树上所 有关键码小于结 点关键码; 右子树上所有关 键码大于结点关 键码;


注意:若从根结点到某个叶结点有一条路径, 路径左边的结点的关键码不一定小于路径上 的结点的关键码。如箭头所示路径。
2

性质:如果对一棵二叉搜索树进行中序 遍历,可以按从小到大的顺序,将各结 点关键码排列起来,所以也称二叉搜索 树为二叉排序树(BST)。 二叉搜索树的类定义 —— 略 二叉搜索树的类定义用二叉链表作为它 的存储表示,许多操作的实现与二叉树 类似。
相关文档
最新文档