叶子结点

Huffman编码树

半世苍凉 提交于 2019-11-28 03:03:25
先简单回顾一下哈夫曼二叉树的概念:哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的带权路径长度记为WPL=(W1*L1+W2*L2+W3*L3+...+ Wn*Ln),N个权值Wi(i=1,2,...n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,...n)。可以证明哈夫曼树的WPL是最小的。 构造哈夫曼树的算法如下: 1)对给定的n个权值{W1,W2,W3,...,Wi,...,Wn}构成n棵二叉树的初始集合F={T1,T2,T3,...,Ti,..., Tn},其中每棵二叉树Ti中只有一个权值为Wi的根结点,它的左右子树均为空。 2)在F中选取两棵根结点权值最小的树作为新构造的二叉树的左右子树,新二叉树的根结点的权值为其左右子树的根结点的权值之和。 3)从F中删除这两棵树,并把这棵新的二叉树同样以升序排列加入到集合F中。 4)重复2)和3),直到集合F中只有一棵二叉树为止。 下面举一个很普通的例子: 对于权2,3,5,7,11,13,17,19,23,29,31,37,41,求具有最小带权外部路径长度的二叉树. 1>找到最小权值和次小权值2和3,然后2+3=5构成两个节点的父母,并将5作为下次合并的新权值;

mysql索引

丶灬走出姿态 提交于 2019-11-27 19:08:18
什么是索引? 索引在mysql中也叫是一种'键',是存储引擎用于快速找到记录的一种数据结构.索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响越发重要. 索引优化应该是对查询性能优化最有效的手段了。索引能够轻易将查询性能提高好几个数量级。 索引相当于字典的音序表,如果要查某个字,如果不使用音序表,则需要从几百页中逐页去查。 索引原理    索引的目的在于提高查询效率,本质都是不断的缩小查询范围来得到我们想要查询的结果.同时把随机的时间变成顺序的事件,  索引的数据结构 树 树状图是一种 数据结构 ,它是由n(n>=1)个有限结点组成一个具有层次关系的 集合 。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 它具有以下的特点:每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结点可以分为多个不相交的子树 根结点 : A 父节点 : A是B,C的父节点 叶子节点:D,E是叶子节点 树的深度/树的高度:高度为3 B+树 每次查找数据时把磁盘IO次数控制在一个很小的数量级,最好是常数数量级。那么我们就想到如果一个高度可控的多路搜索树是否能满足需求呢?就这样,b+树应运而生(B+树是通过二叉查找树,再由平衡二叉树,B树演化而来)。 b+树性质 1 .索引字段要尽量的小

剑指offer 二叉树的下一个结点

☆樱花仙子☆ 提交于 2019-11-27 18:17:57
题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。 初始结构定义如下: /* struct TreeLinkNode { int val; struct TreeLinkNode *left; struct TreeLinkNode *right; struct TreeLinkNode *next; TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) { } }; */ class Solution { public: TreeLinkNode* GetNext(TreeLinkNode* pNode) {} }; 思路:首先知道中序遍历的规则是:左根右,然后作图 结合图,我们可发现分成两大类:1、有右子树的,那么下个结点就是右子树最左边的点;(eg:D,B,E,A,C,G) 2、没有右子树的,也可以分成两类,a)是父节点左孩子(eg:N,I,L) ,那么父节点就是下一个节点 ; b)是父节点的右孩子(eg:H,J,K,M)找他的父节点的父节点的父节点...直到当前结点是其父节点的左孩子位置。如果没有eg:M,那么他就是尾节点。 分析二叉树的下一个节点,一共有以下情况: 1.二叉树为空,则返回空; 2

Acesrc and Travel(HDU6662+换根dp)

不问归期 提交于 2019-11-27 17:07:36
题目链接 传送门 题意 两个绝顶聪明的人在树上玩博弈,规则是轮流选择下一个要到达的点,每达到一个点时,先手和后手分别获得 \(a_i,b_i\) (到达这个点时两个人都会获得)的权值,已经经过的点无法再次经过,直到无法移动则结束游戏,两人都想最大化自己的权值和减对手权值和,问先手减后手权值和最大是多少。 思路 换根 \(DP\) ,和求树的直径有点类似。 \(dp[i][j]\) 表示在 \(i\) 这个结点状态为 \(j\) 时先手权值和减后手权值和最优是多少, \(j\) 为偶数表示当前是先手,为奇数时为后手。 转移方程:我们该 \(dp\) 是倒着推的,也就是说从游戏结束开始往游戏开始推,假设当前是先手选择,那么下一步就是后手移动,按照题目要求后手一定是想最小化先手减后手权值和,因此当前一定是从最小的先手减后手权值和转移过来;如果当前是后手那么就从先手减后手权值和最大转移过来。 需要特别注意的两点是: 从子结点转移过来很好想,就是子结点中相反状态转移过来,也就是当前为先手那么从最小过来;从父亲结点转移过来的时候,因为一个结点只有一个父亲结点,因此如果当前是先手,那么父亲结点也就确定了,因此它要从父亲结点从其他结点转移过来的最大值转移到当前结点,后手同理(因为这里我卡了好久,好菜啊)。 最后枚举答案的时候如果当前点是叶子结点,那么它的答案是从父亲结点贡献的,不能由它自己贡献

20182311 2019-2020-1 《数据结构与面向对象程序设计》第9周学习总结

那年仲夏 提交于 2019-11-27 16:58:10
目录 教材学习内容总结 教材第15章 教材第16章 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周错题总结 点评过的同学博客和代码 学习进度条 正文 20182311 2019-2020-1 《数据结构与面向对象程序设计》第9周学习总结 教材学习内容总结 教材第15章 树的概述 定义:树是一种非线性结果,元素按分层组织。它含有结点和连接结点的边,位于树最高层的是根节点root,结点相对于根节点的位置表示结点的层。树中不含有子节点的结点为叶结点,除叶结点和根结点外的其他结点都是内节点。 树的阶:结点含有的最大子结点数。 路径长度:连接两个结点边的数量。高度:从根结点到叶结点的最长路径的长度。 n元树:任一结点的子节点数目不多于n的 平衡:所有叶结点都位于同一层 完全:树平衡,且最底层的叶结点都在树的左边 树的实现: 数组实现策略:使用数组实现树,数组下标为n的结点的左子树下标为2n,右子树下标为2n+1。思路简单,访问迅速,但是该数组会为不含数据的树位置分配空间,浪费存储空间。 模拟连接策略:在数组中存入孩子的数组索引,为了节省空间会增加删除树中元素时,数组元素进行移位的成本。 链表实现:链表是最常见的造树方法,二叉链表可连接左右节点,三叉链表可指向父节点,多叉链表可以指向更上一级或者siblings 树的遍历:递归遍历比非递归遍历更简单

树的存储、森林的存储

混江龙づ霸主 提交于 2019-11-27 16:53:10
树的存储:   二叉树的存储:     1. 连续存储(顺序存储) 【完全二叉树】,以数组实现       优点:         查找某个节点的父节点和子节点(包括判断有没有子节点和父节点)       缺点:         耗用内存空间过大     2. 链式存储:       一个节点包含三个部分:左子节点地址、数据域、右子节点地址       优点:耗内存小     3. 一般树的存储:       由于计算机的内存是线性的,而树是非线性的。若在计算机里只存树的有效节点,便不能查找某个节点的子节点和父节点(或者说整个树的逻辑存储无法知晓),所以必须要先转化成完全二叉树,把垃圾节点补上。 绿色的是普通树,蓝色的是转为满二叉树,黄色的是去掉了底层连续的叶子节点,即成了完全二叉树    双亲表示法: 由于树中的每个结点都有唯一的一个双亲结点,所以可用一组连续的存储空间(一维数组)存储树中的各个结点,数组中的一个元素表示树中的一个结点,每个结点含 两个域 ,数据域存放结点本身信息,双亲域指示本结点的双亲结点在数组中位置(下标)。方便查询某结点的父结点    孩子表示法: 将树中的每个结点的孩子结点排列成一个线性表,用链表存储起来。对于含有 n 个结点的树来说,就会有 n 个单链表,将 n 个单链表的头指针存储在一个线性表中,这样的表示方法就是孩子表示法。如果结点没有孩子

mysql之索引的数据结构

不羁岁月 提交于 2019-11-27 15:38:53
目录 一、树 二、B+树 2.1 B+树性质 三、聚集索引和辅助索引 3.1 聚集索引 3.2 辅助索引 3.3 聚集索引和非聚集索引的区别 四、再看B+树 4.1 B+树的插入操作 4.2 B+树的删除操作 一、树 树状图是一种 数据结构 ,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 它具有以下的特点:每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结点可以分为多个不相交的子树 根结点:A 父节点:A是B,C的父节点 叶子节点:D,E是叶子节点 树的深度/树的高度:高度为3 二、B+树 前面讲了索引的基本原理,数据库的复杂性,又讲了操作系统的相关知识,目的就是让大家了解,任何一种数据结构都不是凭空产生的,一定会有它的背景和使用场景,我们现在总结一下,我们需要这种数据结构能够做些什么,其实很简单,那就是:每次查找数据时把磁盘IO次数控制在一个很小的数量级,最好是常数数量级。那么我们就想到如果一个高度可控的多路搜索树是否能满足需求呢?就这样,b+树应运而生(B+树是通过二叉查找树,再由平衡二叉树,B树演化而来)。 2.1 B+树性质 索引字段要尽量的小: 通过上面的分析,我们知道IO次数取决于b+数的高度h,假设当前数据表的数据为N

索引的分类--B-Tree索引和Hash索引

蹲街弑〆低调 提交于 2019-11-27 14:49:41
索引是存储引擎用来快速查找记录的一种数据结构,按照实现的方式有不同的种类,想B-Tree索引,hash索引,空间数据索引和全文索引等。下面主要说一下B-Tree索引和Hash索引。 人们在谈论索引的时候如果没有特别说明,一般指的是B-Tree索引。B-Tree索引是使用B-Tree数据结构来存储索引的。B-Tree通常意味着所有的值是按照顺序存储的。B-Tree树有如下几个特征: ⑴树中每个结点至多有m 棵子树; ⑵若根结点不是叶子结点,则至少有两棵子树; ⑶除根结点之外的所有非终端结点至少有[m/2] 棵子树; ⑷所有的非终端结点中包含以下信息数据: (n,A0,K1,A1,K2,…,Kn,An) 其中:Ki(i=1,2,…,n)为关键码,且Ki<Ki+1, Ai 为指向子树根结点的指针(i=0,1,…,n),且指针Ai-1 所指子树中所有结点的关键码均小于Ki (i=1,2,…,n),An 所指子树中所有结点的关键码均大于Kn. n 为关键码的个数。 ⑸所有的叶子结点都出现在同一层次上,并且不带信息(可以看作是外部结点或查找失败的结点,实际上这些结点不存在,指向这些结点的指针为空)。 即所有叶节点具有相同的深度,等于树高度。 对于B-Tree索引,存储引擎在查找记录的时候不再是通过扫描全表来获取需要的数据么人是从索引的根节点进行搜索,根节点的槽中存放了指向子节点的指针

CSUST 2012 一个顶俩 (本校OJ题)(思维+树链剖分)

跟風遠走 提交于 2019-11-27 14:01:35
(点击这里查看原题,不保证可以进去....外网可能比较卡) Description A:一心一意 B:一个顶俩 最近QQ更新后那个成语接龙好像挺火的?但我只知道图论里一条边是一个顶俩个点的emm。 如果我给你一个 n个点 n-1 条边的无向联通图,但是这里头有一些边是脆弱的。随时都面临崩坏的危险。 为了维持他们的连通性,善良的我又给了你 m条紫水晶备用边 (u,v) 。我这里准备 Q个问题,第 i 个问题为一个整数 z ( 1 ≤ z ≤ n − 1 ) 表示若第 z条边崩坏了,你能选出多少条备用边保证图继续保持联通。 Input 第一行三个正整数表示 n,m,Q 接下来 n-1 行每行两个整数 x,y 一条边。 下面 m行每行两个整数 u, v表示备用边。 接下来 Q 行,每行一个整数 z表示询问。 1 ≤ n , m , Q ≤ 1 0 0 0 0 0。保证数据合法。 Output Q行,每行一个整数表示答案。 Sample Input 3 2 2 1 2 1 3 2 3 1 3 1 2 Sample Output 1 2 Hint 第一个问题把第1条边(1,2)删掉,你可以选择备用边(2,3)保证连通性。 第二个问题把第2条边(2,3)删掉,你可以随意选择一条备用边都能保证连通性。 题目分析 题意:给出一个有n个结点的树,同时给出m条备用边u,v,有q次询问

Python实现树

Deadly 提交于 2019-11-27 12:43:00
树 (tree) 是一种非常高效的非线性存储结构。树,可以很形象的理解,有根,有叶子,对应在数据结构中就是根节点、叶子节点,同一层的叶子叫兄弟节点,邻近不同层的叫父子节点,非常好理解。 注:定义来自百度百科。 其他概念解释 二叉树 ,就是每个节点都至多有二个子节点的树。 满二叉树 ,就是除了叶子节点外,每个节点都有左右两个子节点,这种二叉树叫做满二叉树。 完全二叉树 ,就是叶子节点都在最底下两层,最后一层叶子节都靠左排列,并且除了最后一层,其他层的节点个数都要达到最大,这种二叉树叫做完全二叉树。 在接下来的内容里,我们将逐步介绍二叉树的具体功能是如何实现的。 思路: 先定义一个节点 node 类,存储数据 data 和左子节点 left 以及 右子节点 right。 再实现二叉树 binary_tree 的类,应至少有以下属性和函数: 属性:有一个根节点(root) , 它是 node 类。 函数:添加子节点 add ,返回父节点 get_parent,删除子节点 delete。 步骤如下: 1. 创建 Node 类 创建一个 Node 的类,作为基础数据结构:链点,并初始化对应的内参。 具体实现代码如下: class Node(object): def __init__(self,item): self.item = item #表示对应的元素 self.left=None