叶子结点

数据结构-二叉搜索树

匿名 (未验证) 提交于 2019-12-02 23:43:01
1.在一棵二叉搜索树上查找63,序列39、101、25、80、70、59、63是一种可能的查找时的结点值比较序列。 F 2.在一棵由包含4、5、6等等一系列整数结点构成的二叉搜索树中,如果结点4和6在树的同一层,那么可以断定结点5一定是结点4和6的父亲结点。 F 3.二叉搜索树的查找和折半查找的时间复杂度相同。 F 只有平衡的二叉搜索树才与折半查找时间复杂度相同 4.二叉搜索树的最小元素一定位于树根的左子树。 作者: DS课程组 单位: 浙江大学 1-3答案正确(2 分) 1-6 二叉搜索树的最小元素一定位于树根的左子树。 F 还可能是根结点 1.对二叉搜索树进行什么遍历可以得到从小到大的排序序列? A.前序遍历 B.后序遍历 C.中序遍历 D.层次遍历 2.在有 N 个结点且为完全二叉树的二叉搜索树中查找一个键值,其平均比较次数的数量级为: A.O(logN) B.O(N) C.O(NlogN) D.O(N 2 ) 3.已知8个数据元素为(34,76,45,18,26,54,92,65),按照依次插入结点的方法生成一棵二叉搜索树后,最后两层上的结点总数为: A.1 B.2 C.3 D.4 4.将{28, 15, 42, 18, 22, 5, 40}依次插入初始为空的二叉搜索树。则该树的后序遍历结果是: A.5, 15, 18, 22, 40, 42, 28 B.5, 22, 15

[教程] 关于一种比较特别的线段树写法

匿名 (未验证) 提交于 2019-12-02 23:43:01
这篇NOIP水平的blog主要是为了防止我AFO后写法失传而写的(大雾) 博主平常写线段树的时候经常用一种结构体飞指针的写法, 这种写法具有若干优势: 条理清晰不易写挂, 且不需要借助宏定义就可以实现这一点 可以在很小的修改的基础上实现线段树的各种灵活运用, 比如: 可持久化 动态开点 线段树合并 出错会报RE方便用gdb一类工具快速定位错误(平衡树也可以用类似写法, 一秒定位板子错误) 而且将线段树函数中相对比较丑陋的部分参数隐式传入, 所以 (可能) 看上去比较漂亮一些 在使用内存池而不是动态内存的情况下一般比普通数组写法效率要高 原生一体化, 在数据结构之间嵌套时可以直接套用而不必进行各种兼容性修改 接口作为成员函数出现, 不会出现标识符冲突(重名)的情况 下面就以线段树最基础的实现例子: 在 \(O(n+q\log n)\) 的时间复杂度内对长度为 \(n\) 的序列进行 \(q\) 次区间加法区间求和为例来介绍一下这种写法. 对某道题目的完整实现或者其他的例子可以参考我的其他博文中的附带代码或者直接查询我在UOJ/LOJ的提交记录. (可能我当前的写法并没有做到用指针+结构体所能做到的最优美的程度而且没有做严格封装, 求dalao轻喷) 注意这篇文章的重点是写法而不是线段树这个知识点qwq... 前置技能是要知道对某个对象调用成员函数的时候有个 this

测试总结

匿名 (未验证) 提交于 2019-12-02 23:40:02
今后将有大量试题与博客出没(想回去中考。。。) T1: FBI树 我们可以把由“ 0 ”和“ 1”组成的字符串分为三类:全“ 0”串称为 B串,全“ 1”串称为I串,既含“ 0 ”又含“ 1”的串则称为F串。 FBI 树是一种二叉树,它的结点类型也包括 F结点, B结点和I结点三种。由一个长度为 2^N 的“ 0 1”串S可以构造出一棵 F B I树 T ,递归的构造方法如下: T的根结点为 R ,其类型与串 S的类型相同; 2) 若串 S 的长度大于 1,将串 S从中间分开,分为等长的左右子串 S 1 和 S 2 ;由左子串 S 1 构造R的左子树 T 1 ,由右子串 S 2 构造 R 的右子树 T 2 。 现在给定一个长度为 2^N 的“ 0 1”串,请用上述构造方法构造出一棵 F B I树,并输出它的后序遍历序列。 看上去很麻烦,实际上就是根据原字符串进行处理,每次将字符串从中间分为两等长字符串,再分别判断类型 结合代码讲下: 1 #include<iostream> 2 #include<cstdio> 3 #include<queue> 4 #include<algorithm> 5 #include<cstring> 6 #include<string> 7 using namespace std; 8 int n; 9 struct node{ //其中数组大小很鬼畜

二叉排序树或二叉搜索树

匿名 (未验证) 提交于 2019-12-02 23:34:01
一、二叉树基础 1.1 二叉排序树定义 二叉排序树(Binary Sort Tree)又称二叉查找(搜索)树(Binary Search Tree)。它是一颗空树,或者具有下列性质: 若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不为空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树分别为二叉排序树。 上述性质简称二叉排序树性质(BST性质),故二叉排序树实际上是满足BST性质的二叉树。 注意: 当用线性表作为表的组织形式时,可以有三种查找法。其中以二分查找效率最高。但由于二分查找要求表中结点按关键字有序,且不能用链表作存储结构,因此,当表的插入或删除操作频繁时,为维护表的有序性,势必要移动表中很多结点。这种由移动结点引起的额外时间开销,就会抵消二分查找的优点。也就是说,二分查找只适用于静态查找表。若要对动态查找表进行高效率的查找,可采用下二叉树或树作为表的组织形式。不妨将它们统称为树表。 1.2 特点 由BST性质可得: (1) 二叉排序树中任一结点x,其左(右)子树中任一结点y(若存在)的关键字必小(大)于x的关键字。 (2) 二叉排序树中,各结点关键字是惟一的。 注意: 实际应用中,不能保证被查找的数据集中各元素的关键字互不相同,所以可将二叉排序树定义中BST性质(1)里的"小于"改为"大于等于",或将BST性质(2)里的"大于

二叉树(二)

匿名 (未验证) 提交于 2019-12-02 23:05:13
二叉查找树 定义: 例如,这是一棵 二叉查找树 你会发现它的任何一个结点都满足: 如 果 他 比 他 的 ˫ 亲 С , 则 他 是 他 ˫ 亲 的 左 孩 子 如果他比他的双亲小,则他是他双亲的左孩子 如 果 他 比 他 的 ˫ 亲 С , 则 他 是 他 ˫ 亲 的 左 孩 子 如果他比他的双亲小,则他是他双亲的左孩子 特点: 若 它 的 左 子 树 不 Ϊ 空 , 则 左 子 树 上 所 有 结 点 的 ֵ 均 С 于 它 的 根 结 点 的 ֵ 若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值 若 它 的 右 子 树 不 Ϊ 空 , 则 右 子 树 上 所 有 结 点 的 ֵ 均 大 于 它 的 根 结 点 的 ֵ 若它的右子树不为空,则右子树上所有结点的值均大于它的根结点的值 它 的 左 、 右 子 树 Ҳ 分 别 Ϊ 二 叉 查 找 树 它的左、右子树也分别为二叉查找树 但是对于任意一个列表, 不同的输入会构成不同的二叉查找树 建空树 结点结构定义如下: typedef struct node* tree struct node { int data=-1; tree lc=NULL,rc=NULL,parent=NULL; }t[105] 二叉查找树的每个结点比普通二叉树多了指向双亲的指针 以便通过双亲找到前驱、后继 插入操作 函数:

数据结构之B+树

匿名 (未验证) 提交于 2019-12-02 22:56:40
title: 数据结构之B+树 date: 2018-11-04 20:39:00 tags: 数据结构与算法之美 一棵m阶B-树,或者是空树,或者是满足以下性质的m叉树 根结点至少有两个分支; 除根以外的非叶结点,每个结点包含分支数范围[[m/2],m],即关键字字数的范围是[[m/2]-1,m-1],其中[m/2]表示取大于等于m/2的最小整数 所有叶子结点都在树的同一层上,并且指针域为空; 所有的非终端结点应包含如下信息: (n,A0,K1,A1,K2,A2,… ,Kn,An),结点内关键字互不相等,且从小到大排列。 解释: m阶的意思是这颗树最多的分支是多少,每个节点可以包含很多关键字,范围是[[m/2]-1,m-1],比如m为 3,就说明是3阶的B-树, 那么它的树的节点的关键字最少2,最多4个。下面的B+树也是同样的理解。 设关键字的总数为 N ,求 m阶 B- 树的最大层次 L。 在实际的文件系统中,基本上不使用B_树,而是使用B_树的一种变体,称为m阶B+树。 它与B-树的主要不同是叶子结点中存储记录。在B+树中,所有的非叶子结点可以看成是索引,而其中的关键字是作为“分界关键 字”,用来界定某一关键字的记录所在的子树。一棵m阶B+树与m阶B-树的主要差异是: 1.若一个结点有n棵子树,则必含有n个关键字; 2

红黑树笔记

此生再无相见时 提交于 2019-12-02 20:03:36
摘要 本博文默认读者已经明白了二叉搜索树的插入和删除算法,熟练的掌握左右旋。本文适合掌握BiTree和AVL树的读者,但想学习红黑树的读者。 简介 ​ 红黑树(Red Black Tree) 是一种 自平衡二叉查找树 ,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。它是在1972年由Rudolf Bayer发明的,当时被称为平衡二叉B树(symmetric binary B-trees)。后来, 在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的“红黑树” 。红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以 在O(log n)时间内做查找,插入和删除 ,这里的n 是树中元素的数目。 性质 性质1. 节点是红色或黑色。 性质2. 根节点是黑色。 性质3. 每个叶结点(NIL)是黑色的 性质4 . 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点) 性质5 . 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。 ——from《算法导论》P174 定义 定义1. 树中的每一个结点具有五个属性:color, key, left, right, p

B+树原理以及Java代码实现

我与影子孤独终老i 提交于 2019-12-02 19:20:58
最初查找二叉树,由于树的高度会随着有序序列输入而急剧增长,后来出现平衡二叉树,红黑树。 B树可以海量数据的快速查询检索,B树主要分为B树(B-树),B+树,B*树等。 B树(B-树) M路搜索树,参数M定义节点的分支个数; 对于根节点孩子数目为 [2,M],对于其余节点孩子数目为[M/2,M]; 每个节点含有关键字属性,至少 M/2-1 至少M-1;关键字个数=孩子个数-1; 节点有两种类型: 叶子节点 处于同一层 非叶子结点 关键字: K[1], K[2], …, K[M-1];且K[i] < K[i+1];即关键字时有序的;孩子指针:P[1], P[2], …, P[M];其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树; 关键字集合分布在整颗树中;任何一个关键字出现且只出现在一个结点中;搜索有可能在非叶子结点结束;其搜索性能等价于在关键字全集内做一次二分查找; B+树 对于 B树的改进,每个节点具有关键字以及孩子指针属性: 非叶子结点的子树指针与关键字个数相同; 非叶子结点的子树指针 P[i],指向关键字值属于 [K[i], K[i+1]) 的子树( B-树是开区间); 为所有叶子结点增加一个链指针; 所有关键字都在叶子结点出现; 所有关键字都出现在叶子结点的链表中(稠密索引)

对前端数据结构与算法的研究----------------引用

隐身守侯 提交于 2019-12-02 18:18:25
1. 递归 递归就是自己调自己,递归在前端里面算是一种比较常用的算法。假设现在有一堆数据要处理,要实现上一次请求完成了,才能去调下一个请求。一个是可以用Promise,就像《前端与SQL》这篇文章里面提到的。但是有时候并不想引入Promise,能简单处理先简单处理。这个时候就可以用递归,如下代码所示: var ids = [34112, 98325, 68125]; ( function sendRequest ( ) { var id = ids . shift ( ) ; if (id ) { $ . ajax ( {url : "/get" , data : {id } } ) . always ( function ( ) { //do sth. console . log ( "finished" ) ; sendRequest ( ) ; } ) ; } else { console . log ( "finished" ) ; } } ) ( ) ; 上面代码定义了一个sendRequest的函数,在请求完成之后再调一下自己。每次调之前先取一个数据,如果数组已经为空,则说明处理完了。这样就用简单的方式实现了串行请求不堵塞的功能。 再来讲另外一个场景:DOM树。 由于DOM是一棵树,而树的定义本身就是用的递归定义,所以用递归的方法处理树,会非常地简单自然

简单树

跟風遠走 提交于 2019-12-02 14:30:25
什么是树?一种存储结构;什么是树?一个元素集合;什么是树,一类生活规律; 树的定义 : 在树里存储的元素叫做结点,而树就是n(n>=0)个结点的集合; if(n==0) cout<<" 空树 "; else { 每一颗大树有许多片树叶,但是只有一个根部;同理,在非空树里有且仅有一个结点叫做根节点;它是非空树最开始的结点,其它结点都是接在它后面; n>1时: 一颗树中可以有许多棵子树:结点通过顺序关系连接起来,而这些结点的小集合也可以叫做子树; 现实里一棵树的两个分支不可能长着长着又连在一起了,在数据结构里的树也一样,两个子树的之间是没有交际的,它们之间的任意结点不存在连线; } 树的基本名词 : 1.度 结点的度:该结点拥有的子树的个数叫做结点的度; 树的度:树所拥有的结点的度最大值; 2.叶子与枝干 度为0的结点为叶子结点(终端结点); 度不为0的结点为分支结点(非终端结点); 3.结点分类 孩子结点:某结点的子树的根节点为该结点的孩子结点; 双亲结点:孩子结点的上级; 兄弟结点:具有同一个双亲的孩子结点为兄弟结点; 4.树的属性: 路径:从某结点到目标结点走的路(唯一); 路径长度:路径上经过的边数; 5.家族关系 祖先:某路径的头结点称为尾结点的祖先; 子孙:某子树,除了根节点的结点都是根节点的子孙; 6.结点的属性 结点的层数 树的深度:结点层数的最大值; 树的宽度