叶子结点

二叉树的五个重要性质

两盒软妹~` 提交于 2020-04-01 08:26:58
二叉树是最常用的数据结构之一,笔者过去一直将关注点放在复杂的树结构(例如红黑树,自平衡树),认为那些才是树的重要应用,但当重新由基本看起,才发现树的基本定中就隐藏着树这一结构的精髓。尽管是些浅薄蠢笨的理解和推演,但笔者还是满怀兴奋的想要将它记录下来。 一、二叉树的定义 二叉树的定义不用多说,很多书本上都有明确的定义,但有些细节是笔者过去所没有注意的,先给出殷人昆教授对于二叉树的基本定义—— 二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根结点加上两棵分别称为左子树和右子树的、互不相交的二叉树组成。 可以看出二叉树的定义是递归的,根结点的子树仍然是二叉树,到达空子树时递归定义结束。 一般来说,关于树的术语对于二叉树都是适用的,但应该明确的是二叉树不是树,理由如下: 树在图论中被视为用n-1条边连接n个结点的的特殊的图。图的顶点结合非空,故树的顶点非空。图论中另外定义了N叉树,它可以是空树,二叉树属于N叉树。 非空二叉树有根,根结点的子树有左右之分,次序不能颠倒;若其中一棵子树为空,则另一棵子树也必须保持左右之分。树可以没有根(自由树);即使有根,其子树也没有这种区分。 那么,这就出现一个问题——二叉树的叶结点无子女,是否可称它为无子树? 根据定义,应该是不能的,因为可认为叶子点的左右子树为空子树。 虽然认识这一区别的目的并非应试,但笔者还是提一句

初探数据结构之“树”的定义和二叉树定义及性质

匆匆过客 提交于 2020-04-01 08:25:36
这周学习了数据结构中的树,看了郝斌的数据结构视频。。。虽然讲的很浅很浅但是对于我这么笨的人来说刚好能看懂。又通过小组学姐的讲解对树有了一个初步的认识,现在将学到的知识总结一下=、= 一、树的定义 树是由n(n>=0)个节点构成的有限集合,n = 0时称为空树。在任意一颗非空树中: 1)、有且只有一个根节点 2)、除根节点以外,其余节点分成m(m > 0)个互不相交的有限集合T1、T2、。。。Tm,其中每一个集合又都是一棵树 =、=好吧,我承认这是抄书的。下图就一棵树,怎么长得不像树。。。确实不像树,像葡萄(=、=) (图片来自维基百科) 二、树中的术语 1)、结点:包含一个数据元素或指向其他元素的索引(就是上图中的一个小圆圈=、=) 2)、结点的度:一个结点的子树个数(上图中一个圆圈后边跟的几条线,注意是它后边挂的,不包括挂它的那根) 3)、树的度:树中结点的最大度 4)、终端结点(叶子结点):度为零的结点(图中那些挂在最后孤单的那些圆圈=、=) 5)、分支结点:度不为零的结点,也成非终端结点 6)、孩子结点:一个结点对的直接后继(就是直接挂在它后边的圆圈) 7)、双亲结点:一个结点的直接前驱(挂它的那个圈、问:为什么叫双亲结点而不叫父结点或母结点?答:男女平等=、=) 8)、结点的层次:根为第一层,根的孩子结点为第二层,以此类推。。。 9)、树的高度(深度):树中结点的最大层次

平衡二叉树插入操作的详细过程图解

江枫思渺然 提交于 2020-03-30 00:32:20
二叉搜索树/二叉排序树/二叉查找树 是二叉树、任意结点的左子树的值均小于根节点的值,右子树均大于根节点的值 没有键值相等 平衡二叉树(AVL树) 定义 左右字数的高度差的绝对值不超过1,并且两子树都是平衡二叉树 没有键值相等 高度差,又名平衡因子,范围为[-1,0,1],在此规定==平衡因子 bf = 右子树的高度-左子树的高度== 插入操作 当有新的结点插入之前,该树一定是一个平衡二叉树 按照普通搜索树的方式插入结点cur 插入之后,调整cur的 parent.bf:插入到左边 bf --;插入到右边 bf++; bf变为3种值: (1)0:插入结束 (2)-1/1:调整 bf 的过程向上蔓延 (3 )-2/2:进行修复, 对失衡的情况进行修复 插入完成之后,该树依然是一个平衡二叉树 具体步骤 通过查找,找到key的合适的位置并将key插入(如果已经存在,则放弃查找) 设置并修改平衡因子 设置新插入的结点 cur 的平衡因子,新插入的结点的平衡因子是 0(未调整的),因为一定插入在叶子结点 修改 cur 的父节点 parent 的平衡因子 bf 如果cur是parent的左子树,parent.bf -= 1 如果cur是parent的右子树,parent.bf += 1 修改parent.bf 之后,parent.bf 的取值范围为 [-2,-1,0,1,2] 具体情况如下表:

MySQL索引查询原理

烂漫一生 提交于 2020-03-28 00:02:14
什么是索引? “索引”是为了能够更快地查询数据。比如一本书的目录,就是这本书的内容的索引,读者可以通过在目录中快速查找自己想要的内容,然后根据页码去找到具体的章节。 数据库也是一样,如果查询语句使用到了索引,会先去索引里面查询,取得数据所在行的物理地址,进而访问数据。 索引的优缺点 优势:以快速检索,减少I/O次数,加快检索速度;根据索引分组和排序,可以加快分组和排序; 劣势:索引本身也是表,因此会占用存储空间。索引的维护和创建需要时间成本,这个成本随着数据量增大而增大;构建索引会降低数据表的修改操作(删除,添加,修改)的效率,因为在修改数据表的同时还需要修改索引表。 索引的分类 在MySQL中,常见的索引类型有:主键索引、唯一索引、普通索引、全文索引、组合索引。创建语法分别为: 其中,组合索引又称为多列索引,上述代码中最后一个例子就是建立了3列的索引。MySQL在根据索引查询时,会遵循“最左匹配”原则,即先根据col1的条件查,再根据col2的条件查,然后再根据col3的条件去查。 如果跳过了一个列直接查后面的列,比如下面的语句,就不能使用上面创建的索引了: 这里有一个小技巧,如果你前面的列是一个简单的枚举类型,比如性别等,可以用在where语句中加 col1 in(MALE, FEMALE) 来“跳过” col1 列,并使用上述索引。 对于某列如果是字符串且比较长(比如UUID

二叉树的有关计算

て烟熏妆下的殇ゞ 提交于 2020-03-26 12:01:18
有关概念:https://www.cnblogs.com/schips/p/10630533.html 参考:  https://blog.csdn.net/bojie5744/article/details/30744767 计算公式 https://blog.csdn.net/stf1065716904/article/details/80874065 1. n个节点的二叉树一共有((2n)!)/(n! * (n+1)!)种   catalan数,C(n)=(1/(n+1))*((2*n)!/(n!*n!)) 2. n层二叉树的第n层最多为2^(n-1)个 3. 二叉树节点计算公式 N = n0+n1+n2,度为0的叶子节点比度为2的节点数多一个。N=1*n1+2*n2+1 4. 对任何一棵二叉树T,如果其终端节点数为n0,度为2的节点数为n2,则n0=n2+1 5. 具有n个节点的完全二叉树的深度为log2(n) + 1 6. B-树,除叶子与根节点以外的任意结点的分支数介于[m/2,m](取上整) 7. 具有n 个结点的完全二叉树的深度为[log2n]+1 二叉树的度计算 有一个计算二叉树节点的公式,相信很多人都知道:   度为0的节点数为度为2的节点数加1,即n0=n2+1,知道这个公式,相关题目就可以轻松解决; 下面来讨论下如何得出这个公式的: 设: k:总度数 k+1

day03 【List、Set、数据结构、Collections】

。_饼干妹妹 提交于 2020-03-26 01:56:35
day03 【List、Set、数据结构、Collections】 主要内容 数据结构 List集合 Set集合 Collections 教学目标 [ ] 能够说出List集合特点 [ ] 能够说出常见的数据结构 [ ] 能够说出数组结构特点 [ ] 能够说出栈结构特点 [ ] 能够说出队列结构特点 [ ] 能够说出单向链表结构特点 [ ] 能够说出Set集合的特点 [ ] 能够说出哈希表的特点 [ ] 使用HashSet集合存储自定义元素 [ ] 能够说出可变参数的格式 [ ] 能够使用集合工具类 [ ] 能够使用Comparator比较器进行排序 第一章 数据结构 2.1 数据结构有什么用? 当你用着java里面的容器类很爽的时候,你有没有想过,怎么ArrayList就像一个无限扩充的数组,也好像链表之类的。好用吗?好用,这就是数据结构的用处,只不过你在不知不觉中使用了。 现实世界的存储,我们使用的工具和建模。每种数据结构有自己的优点和缺点,想想如果Google的数据用的是数组的存储,我们还能方便地查询到所需要的数据吗?而算法,在这么多的数据中如何做到最快的插入,查找,删除,也是在追求更快。 我们java是面向对象的语言,就好似自动档轿车,C语言好似手动档吉普。数据结构呢?是变速箱的工作原理。你完全可以不知道变速箱怎样工作,就把自动档的车子从 A点 开到 B点

java各种排序算法及实现

不羁岁月 提交于 2020-03-26 00:18:44
3 月,跳不动了?>>> 先来看看8种排序之间的关系: 下图是各种排序的比较: 1, 直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排 好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数 也是排好顺序的。如此反复循环,直到全部排好顺序。 在插入算法中,如果有一个最小的数在数组的最后面,用插入算法就会从最后一个 位置移动到第一个。 (2)实例 package cglib; public class StringNumber { public static void insertSort(int[] a) { if (a == null || a.length < 2) { return; } int length=a.length; //数组长度 int j; //当前值的位置 int i; //指向j前的位置 int key; //当前要进行插入排序的值 //从数组的第二个位置开始遍历值 for(j=1;j<length;j++){ key=a[j]; i=j-1; System.out.println(" 将i="+i); //a[i]比当前值大时,a[i]后移一位,空出i的位置,好让下一次循环的值后移 while(i>=0 && a[i]>key){ System.out.println("进 i="+i); a[i+1]

胜者树和败者树

点点圈 提交于 2020-03-25 14:54:40
胜者树和败者树都是完全二叉树,是树形选择排序的一种变型。每个叶子结点相当于一个选手,每个中间结点相当于一场比赛,每一层相当于一轮比赛。 不同的是,胜者树的中间结点记录的是胜者的标号;而败者树的中间结点记录的败者的标号。 胜者树与败者树可以在log(n)的时间内找到最值。任何一个叶子结点的值改变后,利用中间结点的信息,还是能够快速地找到最值。在k路归并排序中经常用到。 一、胜者树 胜者树的一个优点是,如果一个选手的值改变了,可以很容易地修改这棵胜者树。只需要沿着从该结点到根结点的路径修改这棵二叉树,而不必改变其他比赛的结果。 Fig. 1 Fig.1是一个胜者树的示例。规定数值小者胜。 b3 PK b4,b3胜b4负,内部结点ls[4]的值为3; b3 PK b0,b3胜b0负,内部结点ls[2]的值为3; b1 PK b2,b1胜b2负,内部结点ls[3]的值为1; b3 PK b1,b3胜b1负,内部结点ls[1]的值为3。. 当Fig. 1中叶子结点b3的值变为11时,重构的胜者树如Fig. 2所示。 b3 PK b4,b3胜b4负,内部结点ls[4]的值为3; b3 PK b0,b0胜b3负,内部结点ls[2]的值为0; b1 PK b2,b1胜b2负,内部结点ls[3]的值为1; b0 PK b1,b1胜b0负,内部结点ls[1]的值为1。. Fig. 2

20162322 朱娅霖 作业007 树

百般思念 提交于 2020-03-25 02:59:50
20162322 2017-2018-1 《程序设计与数据结构》第七周学习总结 教材学习内容总结 重要概念、性质的强调 度 (order):树的度表示树中任意结点的最大子结点数。 树的 高度 (height; 或 深度 , depth):树从根到叶结点的最长路径的长度。 满树 与 完全树 二叉树的性质 性质1:在二叉树的第i层上至多有2i-1个结点(i≥1)。(数学归纳法可证) 性质2:深度为k的二叉树最多有2k-1个结点(k≥1)。(由性质1,通过等比数列求和可证) 性质3:一棵二叉树的叶子结点数为n0,度为2的结点数为n2,则n0 = n2 + 1。 完全二叉树的性质: 性质4:具有n个结点的完全二叉树的深度为floor(log2n) + 1 。 性质5:如果对一棵有n个结点的完全二叉树(其深度为floor(log2n) + 1 )的结点按层序编号,则对任一结点i(1≤i≤n)有: (1) 如果i = 1,则结点i是二叉树的根,无双亲;如果i > 1,则其双亲PARENT(i)是结点 floor((i)/2)。 (2)如果2i > n,则结点i无左孩子;否则其左孩子LCHILD(i)是结点2i。 (3)如果2i + 1 > n,则结点i无右孩子;否则其右孩子RCHILD(i)是结点2i + 1。 树的遍历 以下所有遍历都是基于先左后右原则 所谓的 先序遍历、中序遍历和后序遍历

JDK TreeMap Red-Black Tree

你离开我真会死。 提交于 2020-03-23 19:34:16
3 月,跳不动了?>>> 介绍另一种平衡二叉树:红黑树( Red Black Tree ),红黑树由 Rudolf Bayer 于 1972 年发明,当时被称为平衡二叉 B 树( symmetric binary B-trees ), 1978 年被 Leonidas J. Guibas 和 Robert Sedgewick 改成一个比较摩登的名字:红黑树。 红黑树和之前所讲的 AVL 树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。自从红黑树出来后, AVL 树就被放到了博物馆里,据说是红黑树有更好的效率,更高的统计性能。不过在我了解了红黑树的实现原理后,并不相信这是真的,关于这一点我们会在后面进行讨论。 红黑树和 AVL 树的区别在于它使用颜色来标识结点的高度,它所追求的是局部平衡而不是 AVL 树中的非常严格的平衡。之前我们在讲解 AVL 树时,已经领教过 AVL 树的复杂,但 AVL 树的复杂比起红黑树来说简直是小巫见大巫。红黑树是真正的变态级数据结构。 红黑树的平衡 红黑树首先是一棵二叉查找树,它每个结点都被标上了颜色(红色或黑色),红黑树满足以下 5 个性质: 1、 每个结点的颜色只能是红色或黑色。 2、 根结点是黑色的。 3、 每个叶子结点都带有两个空的黑色结点(被称为黑哨兵),如果一个结点 n 的只有一个左孩子,那么 n