叶子结点

数据结构与算法——平衡二叉树

旧城冷巷雨未停 提交于 2019-12-01 21:34:38
1 引言 2 二叉搜索树 2.1 定义 2.2 性质 2.3 节点结构 2.4 创建二叉搜索树 2.5 查找 2.6 插入 2.7 删除 3 平衡二叉树 3.1 定义 3.2 平衡因子 3.3 节点结构 3.4 左旋与右旋 3.5 插入 1 引言   二叉树是数据结构中的重点与难点,也是应用较为广泛的一类数据结构。二叉树的基础知识在之前的数据结构与算法——二叉树基础中已经详细介绍。本篇文章将着重介绍两类二叉树,二叉搜索树和平衡二叉树。 2 二叉搜索树 2.1 定义   二叉搜索树又称二叉查找树,亦称为二叉排序树。设x为二叉查找树中的一个节点,x节点包含关键字key,节点x的key值记为key[x]。如果y是x的左子树中的一个节点,则key[y] <= key[x];如果y是x的右子树的一个节点,则key[y] >= key[x]。 2.2 性质   (1)若左子树不空,则左子树上所有节点的值均小于它的根节点的值;   (2)若右子树不空,则右子树上所有节点的值均大于它的根节点的值;   (3)左、右子树也分别为二叉搜索树;   例如:图2.2.1所示的二叉树为一棵二叉搜索树。 图2.2.1   例如:图2.2.2所示不是一棵二叉搜索树,因为节点40的左孩子节点值为44,不满足二叉搜索树的定义。 图2.2.2 2.3 节点结构   二叉树的节点结构通常包含三部分,其中有:左孩子的指针

红黑树 -- 草稿

天涯浪子 提交于 2019-12-01 10:54:58
---恢复内容开始--- - 这只是一篇草稿,还没排版,之前一直想给自己写一个文章的模板,一直还没写,所以估计写的比较慢,所以先放出来文章,后面再来填坑吧。 这篇文章的初衷是看到面试问题有问到红黑树,甚至有手撕红黑树代码的?可怕,红黑树的讨论情况很多,一不小心就绕进去,真让人犯难,而且网上的文章各有各的说法,不少人理解甚至是错误的。 - 红黑树:红黑树是一种二叉平衡树,二叉查找树,它牛逼之处就在于它足够的平衡,可以达到高度至多2lg(n+1),所以在java中的treemap和c++ set, multiset, map, multimap就使用的红黑树。 - 红黑树的性质:1. 结点分为红色和黑色两种 2.根节点是黑色的 3.每个叶子结点(nil)是黑色的(就是空代表了黑色) 4.不存在父子都是红色的情况(连续两个红色) 5.任意孩子到根节点的路径上的黑色数量都是相等的(important) - 本文将解释 以下内容: 1. 红黑树的插入(简单的插入)与调整(调整平衡)。 2. 红黑树的删除(也带有调整,使其便于调整平衡)与调整(调整平衡)。 ### 插入 #### 插入方式:   先考虑插入什么颜色的结点,这里需要说明颜色只是我们用于保证平衡的一种方法,与数据无关。 因为插入黑色结点除非在根节点,否则一定会导致一个分支上的所有子分支都多了一个黑,如此不满足性质5(简称 路黑同)

几种排序算法

梦想与她 提交于 2019-12-01 10:06:22
1、冒泡排序 最简单的一种排序算法。假设长度为n的数组arr,要按照从小到大排序。则冒泡排序的具体过程可以描述为:首先从数组的第一个元素开始到数组最后一个元素为止,对数组中相邻的两个元素进行比较,如果位于数组左端的元素大于数组右端的元素,则交换这两个元素在数组中的位置,此时数组最右端的元素即为该数组中所有元素的最大值。接着对该数组剩下的n-1个元素进行冒泡排序,直到整个数组有序排列。算法的时间复杂度为O(n^2)。 // 冒泡排序 void BubbleSort(int arr[], int length) { for (int i = 0; i < length; i++) { for (int j = 0; j < length - i - 1; j++) { if (arr[j] > arr[j + 1]) { int temp; temp = arr[j + 1]; arr[j + 1] = arr[j]; arr[j] = temp; } } } } 假设我们现在排序ar[]={1,2,3,4,5,6,7,8,10,9}这组数据,按照上面的排序方式,第一趟排序后将10和9交换已经有序,接下来的8趟排序就是多余的,什么也没做。所以我们可以在交换的地方加一个标记,如果那一趟排序没有交换元素,说明这组数据已经有序,不用再继续下去。 void BubbleSort(int arr

B树,B+树,B*树

六月ゝ 毕业季﹏ 提交于 2019-12-01 09:36:36
B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right); 2.所有结点存储一个关键字; 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树; 如: B树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中; 否则,如果查询关键字比结点关键字小,就进入左儿子;如果比结点关键字大,就进入 右儿子;如果左儿子或右儿子的指针为空,则报告找不到相应的关键字; 如果B树的所有非叶子结点的左右子树的结点数目均保持差不多(平衡),那么B树 的搜索性能逼近二分查找;但它比连续内存空间的二分查找的优点是,改变B树结构 (插入与删除结点)不需要移动大段的内存数据,甚至通常是常数开销; 如: 但B树在经过多次插入与删除后,有可能导致不同的结构: 右边也是一个B树,但它的搜索性能已经是线性的了;同样的关键字集合有可能导致不同的 树结构索引;所以,使用B树还要考虑尽可能让B树保持左图的结构,和避免右图的结构,也就 是所谓的“平衡”问题; 实际使用的B树都是在原B树的基础上加上平衡算法,即“平衡二叉树”;如何保持B树 结点分布均匀的平衡算法是平衡二叉树的关键;平衡算法是一种在B树中插入和删除结点的 策略; B-树 是一种多路搜索树(并不是二叉的): 1.定义任意非叶子结点最多只有M个儿子;且M>2; 2.根结点的儿子数为[2, M]; 3

数据结构与算法之二叉树

馋奶兔 提交于 2019-12-01 09:32:12
树 树的概念 树(英语:tree)是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据集合。它是由n(n>=0)个有限节点组成一个具有层次关系的集合。把它叫做“ 树 ”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: 当n=0时,为空树,在任何一棵空树中: 有且仅有一个特定的称为根(Root)的节点 当n>1时: 除根节点外,其余节点可分为m(m>0)个互不相交的有限集T1、T2、…、Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。 每个节点有零个或多个子节点; 没有父节点的节点称为根节点; 每一个非根节点有且只有一个父节点; 除了根节点外,每个子节点可以分为多个不相交的子树; 树的术语 节点的度 :一个节点含有的子节点的个数称为该节点的度。 B的子节点为D、E、F, 因此,节点B的度为3。 树的度 :一棵树中,最大的节点的度称为树的度。 最大的节点的度为B节点的度,因此该树的度为3。 叶节点 或 终端节点 :度为零的节点。 不能往下再分的节点:K、J、F、L、O、P。 父亲节点 或 父节点 :若一个节点含有子节点,则这个节点称为其子节点的父节点。 如:K的父节点为I。 孩子节点或子节点 :一个节点含有的子树的根节点称为该节点的子节点。 B的孩子节点或子节点为:D、E、F。 兄弟节点

软件设计师笔记

和自甴很熟 提交于 2019-11-30 21:16:48
上午题 一、计算机组成原理与结构体系 数据的表示 进制转换 R进制转十进制 : 按权展开法 例如二进制 10100 = $1\times2^4+1\times2^2$ = 20 例如七进制 604 = $6\times7^2 + 4\times7^0$ = 298 十进制转R进制 : 短除法 例如20转二进制 2|20 余 0 2|10 余 0 2|5 余1 2|2 余0 2|1 余1 ​ 0 余数从下往上就是10100 二进制转八进制与十六进制 转八进制,从右到左三位一段 例如 10 001 110 = 2 1 6 转十六进制,从右到左四位一段 例如1000 1110 = 8 E 原码反码补码移码 正数 1 负数 1 正1加负1 (1-1) 原码 0000 0001 1000 0001 1000 0010 反码 0000 0001 1111 1110 1111 1111 补码 0000 0001 1111 1111 0000 0000 移码 1000 0001 0111 1111 1000 0000 原码: 1B(字节byte) = 8bit 如果用一个字节表示1,会先转成二进制,再在右边补7个0,其中最右边的0是符号位,0代表正数,1代表负数 即1= 0 000 0001 -1= 1 000 0001 当1+(-1)时,原码1000 0010,值是-2,值是不对的

索引数据结构 B+树等

人盡茶涼 提交于 2019-11-30 16:53:52
本文将详细介绍数据结构中的一些常用的搜索树结构,包括:B树、B-树、B+树、B*树;分别介绍这些树结构的定义、特征、搜索方法、性能等情况,最后给出了一个简要的总结。 一、 B 树 B树即二叉搜索树,它的特征是: 1.所有非叶子结点至多拥有两个儿子(Left和Right); 2.所有结点存储一个关键字; 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树; 一颗典型的B树图如下所示: B 树的搜索: 从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则,如果查询关键字比结点关键字小,就进入左儿子;如果比结点关键字大,就进入右儿子;如果左儿子或右儿子的指针为空,则报告找不到相应的关键字; B 树的性能: 如果B树的所有非叶子结点的左右子树的结点数目均保持差不多(平衡),那么B树的搜索性能逼近二分查找;但它比连续内存空间的二分查找的优点是,改变B树结构(插入与删除结点)不需要移动大段的内存数据,甚至通常是常数开销,如下图所示: 但B树在经过多次插入与删除后,有可能导致不同的结构,如下图: 右边也是一个B树,但它的搜索性能已经是线性的了;同样的关键字集合有可能导致不同的树结构索引;所以,使用B树还要考虑尽可能让B树保持左图的结构,和避免右图的结构,也就是所谓的“平衡”问题; 实际使用的B树都是在原B树的基础上加上平衡算法,即“平衡二叉树”

B树和B+树

ぃ、小莉子 提交于 2019-11-30 16:46:43
B树和B+树 标签(空格分隔): 数据结构 参考/转载 : https://www.cnblogs.com/nullzx 1. B树 1.1 B树的定义 B树也称为B-树, 它是一颗多路平衡的查找树, 当我们描述一颗B树的时候需要指定他的阶数, 阶数表示了一个节点最多有多少个孩子节点, 一般用 m 表示. 当 m 取2的时候, 就是我们常见的二叉搜索树. 一颗 m 阶的B树定义如下: 每个节点最多有m-1个关键字. 根节点最少有1个关键字. 非根节点最少有Math.ceil(m/2)-1个关键字. 每个根节点中的关键字都按照从小到大的顺序排列, 每个关键字的左子树中的所有关键字都小于它, 而右子树中的所有关键字节点都大于它. 所有叶子节点都位于同一层, 或者说根节点到每个叶子节点的长度都相同. 上图是一个阶数为4的B树, 在实际应用中的B树的阶数都非常大(通常大于100), 所以即使存储大量的数据, B树的高度依然会比较小, 每个节点中存储了关键字(Key)和关键字对应的数据(data), 以及孩子节点的指针. 我们将一个key何其对应的data成为一个记录, 但为了方便描述, 除非特别说明, 后续文中就采用key来代替(key,value)键值对这个整体. 在数据库中我们将B树(和B+树)作为索引结构, 可以加快查询速度, 此时B树中的key就代表键,

用优先队列式分支限界法解决0-1背包问题

我是研究僧i 提交于 2019-11-30 16:38:29
用优先队列式分支限界法解决0-1背包问题的算法思想: 1.分支限界法常以广度优先或最小耗费优先(最大效益优先)方式搜索问题的解空间树, 对于0-1背包问题的解空间树是一个颗子集树。 2.在分支限界法中有一个活结点表,活结点表中的每个活结点只有一次机会成为扩展结点,一旦成为 扩展结点就一次性产生所有儿子结点,在这些儿子结点中,导致不可行解或导致非最优解的儿子 结点被舍弃,其余儿子结点被加入到活结点表中。对于0-1背包问题中的每个活结点只有两个儿子 结点,分别表示对物品i的选取和对物品i的舍去;在判断儿子结点是否能加入到活结点表中,有两个 函数需要满足,第一个称为约束函数,判断能否满足背包容量约束,第二个称为限界函数,判断 是否可能有最优解。 3.为了尽快找到0-1背包问题的解,每次选取下一个活结点成为扩展结点的判断依据是当前情况下 最有可能找到最优解的下一个结点。因此,每次选择扩展结点的方法:当前情况下,在活结点表中 选择活结点的上界uprofit(通过限界函数Bound求出)最大的活结点成为当前的扩展结点。 这一过程一直持续到找到所需的解或活结点表为空时为止。这个过程体现出分支限界法以“最大 效益优先”方式进行。 4.为了在活结点表中选择拥有最大的上界uprofit的活结点,在活结点表上实现优先队列。 5.通过上述第3点,可以求出0-1背包问题的最优值。为了求出0

图解数据结构-树及树的遍历

末鹿安然 提交于 2019-11-30 14:58:14
当你第一次学习编码时,大部分人都是将数组作为主要数据结构来学习。 之后,你将会学习到哈希表。如果你是计算机专业的,你肯定需要选修一门数据结构的课程。上课时,你又会学习到链表,队列和栈等数据结构。这些都被统称为线性的数据结构,因为它们在逻辑上都有起点和终点。 当你开始学习树和图的数据结构时,你会觉得它是如此的混乱。因为它的存储方式不是线性的,它们都有自己特定的方式存储数据。 定义 树是众所周知的非线性数据结构。它们不以线性方式存储数据。他们按层次组织数据。 树的定义 树(Tree)是n(n>=0)个结点的有限集。n=0时称为空树。 在任意一颗非空树中: (1) 有且仅有一个 特定的称为根(Root)的结点。 (2)当n>1时,其余结点可分为m(m>0)个 互不相交的有限集 T1、T2、.....、Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。 下图就符合树的定义: 其中根结点A有两个子树: 我们硬盘的文件系统就是很经典的树形结构。 “树”它具有以下的特点: ①每个节点有零个或多个子节点; ②没有父节点的节点称为根节点; ③每一个非根节点有且只有一个父节点; ④除了根节点外,每个子节点可以分为多个不相交的子树; 树( tree )是被称为结点( node )的实体的集合。结点通过边( edge )连接。每个结点都包含值或数据( value/date )