叶子结点

数据结构--二叉堆

女生的网名这么多〃 提交于 2019-11-29 04:21:34
二叉堆是完全二元树或者是近似完全二元树,按照数据的排列方式可以分为两种:最大堆和最小堆。 最大堆:父结点的键值总是大于或等于任何一个子节点的键值;最小堆:父结点的键值总是小于或等于任何一个子节点的键值。示意图如下: 二叉堆一般都通过"数组"来实现。数组实现的二叉堆,父节点和子节点的位置存在一定的关系。有时候,我们将"二叉堆的第一个元素"放在数组索引0的位置,有时候放在1的位置。当然,它们的本质一样(都是二叉堆),只是实现上稍微有一丁点区别。 假设"第一个元素"在数组中的索引为 0 的话,则父节点和子节点的位置关系如下: (01) 索引为i的左孩子的索引是 (2*i+1); (02) 索引为i的右孩子的索引是 (2*i+2); (03) 索引为i的父结点的索引是 floor((i-1)/2); 假设"第一个元素"在数组中的索引为 1 的话,则父节点和子节点的位置关系如下: (01) 索引为i的左孩子的索引是 (2*i); (02) 索引为i的右孩子的索引是 (2*i+1); (03) 索引为i的父结点的索引是 floor(i/2); 二、二叉堆的操作 堆一般使用数组来构建,假设为数组a[],结点通常存储在a[1],这样对于下标为k的结点a[k]来说,其左孩子的下标为2*k,右孩子的下标为2*k+1。 1、插入结点到堆中. 由于小根堆是由数组实现的完全二叉树

小根堆(Heap)的详细实现

房东的猫 提交于 2019-11-29 03:36:24
堆的介绍 Heap是一种数据结构具有以下的特点: 1)完全二叉树 2)heap中存储的值是偏序 Min-heap: 父节点的值小于或等于子节点的值 Max-heap: 父节点的值大于或等于子节点的值 堆的存储 一般都用数组来表示堆,i结点的父结点下标就为(i–1)/2。它的左右子结点下标分别为2 * i + 1和2 * i + 2。如第0个结点左右子结点下标分别为1和2。 ​ 由于堆存储在下标从0开始计数的数组中,因此,在堆中给定下标为i的结点时: (1)如果i=0,结点i是根结点,无父结点;否则结点i的父结点为结点(i-1)/2; (2)如果2i+1>n-1,则结点i无左子女;否则结点i的左子女为结点2i+1; (3)如果2i+2>n-1,则结点i无右子女;否则结点i的右子女为结点2i+2。 堆的操作:小根堆插入元素 插入一个元素:新元素被加入到heap的末尾,然后更新树以恢复堆的次序。 每次插入都是将新数据放在数组最后。可以发现从这个新数据的父结点到根结点必然为一个有序的数列,现在的任务是将这个新数据插入到这个有序数据中——这就类似于直接插入排序中将一个数据并入到有序区间中。需要从下网上,与父节点的关键码进行比较,对调。 ​ 堆的操作:删除小根堆堆的最小元素 按定义,堆中每次都删除第0个数据。为了便于重建堆,实际的操作是将最后一个数据的值赋给根结点,堆的元素个数-1

B-Tree(B树)

随声附和 提交于 2019-11-29 03:23:23
关键词: B树 前言: (1)具体讲解之前,有一点,再次强调下:B-树,即为B树。因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树,其实,这是个非常不好的直译,很容易让人产生误解。如人们可能会以为B-树是一种树,而B树又是一种树。而事实上是,B-tree就是指的B树。 (B树 <=> B-树)。引自: https://www.cnblogs.com/yfzhou/p/10290006.html (2)内节点:节点内嵌的节点 1、B树定义:   对于B树,我们一般描述成M(M>2)阶B树(这里的M阶指的是树的所有结点中的子树个数的最大值)。对于B树来说,它必须满足如下的性质:    性质 :   (1)节点的性质: 所有的叶子节点都在同一层; 每个节点由若干个指针和记录组成 。其中,每个节点中记录的个数比指针的个数少1个,指针将记录一一隔开。   (2)指针的性质: 每一个指针指向一个子节点; 每个节点最多有M个指针; 非叶子节点的根结点最少有两个分支; 叶子节点最少包含一个记录和两个空指针,叶节点的指针均为NULL; 非根非叶结点至少有ceil( M /2 )个分支;(ceil( M/2 )>=3)(分析:当这个值等于2,那么就变成二叉树;当这个值等于1,那么就变成链表。所以这个值必须大于等于3) 对于任意一个节点:ceil(M/2) <= d <= m

二叉树基础知识总结

我们两清 提交于 2019-11-29 03:15:10
原文: https://blog.csdn.net/xiaoquantouer/article/details/65631708 ,写的清晰明了,直接搬过来了 一、树的定义 树是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。 树具有的特点有: (1)每个结点有零个或多个子结点 (2)没有父节点的结点称为根节点 (3)每一个非根结点有且只有一个父节点 (4)除了根结点外,每个子结点可以分为多个不相交的子树。 树的基本术语有: 若一个结点有子树,那么该结点称为子树根的“双亲”,子树的根称为该结点的“孩子”。有相同双亲的结点互为“兄弟”。一个结点的所有子树上的任何结点都是该结点的后裔。从根结点到某个结点的路径上的所有结点都是该结点的祖先。 结点的度:结点拥有的子树的数目 叶子结点:度为0的结点 分支结点:度不为0的结点 树的度:树中结点的最大的度 层次:根结点的层次为1,其余结点的层次等于该结点的双亲结点的层次加1 树的高度:树中结点的最大层次 森林:0个或多个不相交的树组成。对森林加上一个根,森林即成为树;删去根,树即成为森林。 二、二叉树 1、二叉树的定义 二叉树是每个结点最多有两个子树的树结构。它有五种基本形态:二叉树可以是空集;根可以有空的左子树或右子树;或者左、右子树皆为空。 2、二叉树的性质 性质1:二叉树第i层上的结点数目最多为2i-1(i>=1)

走近二叉树

僤鯓⒐⒋嵵緔 提交于 2019-11-29 00:41:23
树的简介 一起探索二叉树 两种代码实现方式 树的简介 树是什么呢???? 在我看来,树就是结点的有限集合,n个结点构成某种所谓的“家族关系”,就形成了树。 上述括号里面的数字均为结点的索引结点,括号外面的都为结点存储的数据。 树的一些相关概念: 1.孩子:就是子结点,可以说是某个结点的后代,比如说,上图中,1和2就是0的子结点。 2.双亲:比如说1就是8的父结点。 3。度:当前结点直接的孩子,比如说,0直接的子结点就是1和2,所以它的度为2. 4.叶子:终端结点,比如说,3,4,5,6结点均到底了,不能再下去了,到了终端,因此就是叶子。 5.根:非终端结点,上述,0,1,2都没到底,均为根。 6.深度: 结点深度:看它是第几代。 树的深度:看这个树有几代。 一起探索二叉树 二叉树是树的一种,就是每一个结点的度数都不大于2,最多有两个孩子。 二叉树有几种不同的遍历,都和根结点输出的顺序有关,其分别为 前序遍历:根结点->左结点->右结点 中序遍历:左结点->根结点->右结点 后序遍历:左结点->右结点->根结点 以下是我自己做的图形演示(稍微丑点了,别介意哈) 六、二叉树的性质: 1、若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2i-1个节点 2、若规定只有根节点的二叉树的深度为1,则深度为k的二叉树的最大节点数是2k-1 3、对任何一棵二叉树,如果其叶子节点个数为n0

数据结构--哈夫曼树

◇◆丶佛笑我妖孽 提交于 2019-11-28 22:27:45
Huffman Tree,中文名是哈夫曼树或霍夫曼树,它是最优二叉树。 定义 :给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小,则这棵树被称为哈夫曼树。 这个定义里面涉及到了几个陌生的概念,下面就是一颗哈夫曼树,我们来看图解答。 (01) 路径和路径长度 定义 :在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。 例子 :100和80的路径长度是1,50和30的路径长度是2,20和10的路径长度是3。 (02) 结点的权及带权路径长度 定义 :若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。 例子 :节点20的路径长度是3,它的带权路径长度= 路径长度 * 权 = 3 * 20 = 60。 (03) 树的带权路径长度 定义 :树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL。 例子 :示例中,树的WPL= 1* 100 + 2*5 0 + 3* 20 + 3* 10 = 100 + 100 + 60 + 30 =290。 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支构成这两个结点之间的路径。 ② 路径长度

题解 P1040 【加分二叉树】

↘锁芯ラ 提交于 2019-11-28 21:47:43
思路: 以中序遍历的方式输入结点上的值,由于我们需要以前序遍历的方式输出结点, 所以我们必须要知道根结点 我们要确定最大根结点就必须求出最大权值树,我们枚举所有结点作为根结点 如果根结点的编号为x,那么左子树的结点有1~x-1,右子树 结点有x+1~n 代码: #include<bits/stdc++.h> using namespace std; const int N=35; int tree[N]; //用于存储结点的值 int value[N][N]; //用于存储最大权值和 int root[N][N]; //存储根结点 int dfs(int l,int r) { if(l>r) //空子树,规定其加分为1 return 1; if(l==r) //叶子结点,直接返回该结点的值,且将其记录为根 { root[l][r]=l; return tree[l]; } /* 在每一次搜索的开始,如果已经做过,直接调用答案,回溯 */ if(value[l][r]) //记忆化搜索 防止重复计算 return value[l][r]; // int ans=0,flag; for(int i=l;i<=r;i++) //枚举子层次根结点 { int sum=dfs(l,i-1)*dfs(i+1,r)+tree[i]; if(sum>value[l][r]) { value[l]

堆的基本知识及应用

廉价感情. 提交于 2019-11-28 21:45:52
本文主要内容: 1.堆的向上调整、向下调整 2.建大堆、建小堆 3.优先级队列 4.TopK问题 1.二叉树可以用数组的形式保存吗? 可以,按照层序的方式把值平铺在数组上(完全二叉树) 非完全二叉树平铺到数组上会有很多的空洞,往往不用这种方式(堆) 2.关注下标的变化 已知parent的下标,左孩子的下标为2 parent+1,右孩子的下标为2 parent+2 已知child的下标(不分左右孩子),parent= (child-1)/2 3.堆 (1)在逻辑上是一颗完全二叉树 (2)物理上是一个数组(写代码时当数组处理) (3)满足任意位置的值大于等于它的左右孩子的值(大堆),反之小堆。 堆的基本功能:找最值 4.关于堆,有以下几个重要操作: 向下调整(堆化) 前提:在整个堆中,除了要调整的位置之外,其余位置都已经满足堆的性质 (1)找到两个孩子中最大的孩子 (2)比较最大孩子的值和要调整位置的值,如果满足堆的性质就不需要调整了,否则交换两者的值。继续调整原来最大孩子的下标位置 注意:如果要调整的位置是叶子结点就不需要调整了 前提:除了index位置外,其他位置都满足堆的性质,经过向下调整 首先判断index位置是不是叶子结点,即结点的左孩子是不是大于等于size,接着判断index结点是否有右孩子(分为三种情况),如果有右孩子,判断右孩子的值与左孩子的值,取最大的

剑指offer39:平衡二叉树

纵饮孤独 提交于 2019-11-28 18:58:46
1 题目描述   输入一棵二叉树,判断该二叉树是否是平衡二叉树。 2 思路和方法   平衡二叉树,又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。但是频繁旋转会使插入和删除牺牲掉O(logN)左右的时间,不过相对二叉查找树来说,时间上稳定了很多。https://blog.csdn.net/qq_43091156/article/details/88558966   从 叶节点开始 ,依次往上求其子树高度,如果在某一子树上不满足要求,则一路返回,不再继续遍历。即, 先依次遍历左子树,如果左子树是平衡二叉树,再依次遍历右子树。 时间最坏O(n),空间O(n)。 3 C++核心代码 1 class Solution { 2 public: 3 // 返回值:树的深度 4 bool IsBalanced_Solution(TreeNode* pRoot){ 5 if (pRoot == nullptr) 6 return true; // ko 7 return TreeDepth(pRoot)!=-1; 8 } 9 10 // 返回值: 11 // -1:子树不平衡 12

王道数据结构——树与二叉树

亡梦爱人 提交于 2019-11-28 17:55:33
本文主要讲述了数据结构中树的基本概念,二叉树,树与森林以及树与二叉树的应用。 知识框架如下图所示: 树的基本概念 树是N(N>=0)个结点的有限集合,N=0时,称为空树。 而任何一棵非空树应该满足,有且仅有一个根结点,当N>1时,其余结点又可以分为几个互不相交的有限集合,其本身又构成一个树(体现递归的定义),称为根结点的子树。需要特别说明的一个重要结论是,任何一个有N(N>=1)个结点的树都有N-1条边。 二叉树的基本概念 二叉树是一种特殊的树形结构,其特点是不存在度大于2的结点,且每个结点的子树(若有)均存在左右之分,其次序不能颠倒。 严格一点来说,二叉树是n(n>=0)个结点的有限集合。 1,n=0时,表示空二叉树。 2,n>0时,由根结点和互不相交的被称为根的左子树和右子树组成,而左子树和右子树也分别是一颗二叉树。 几种特殊的二叉树:满二叉树,完全二叉树,排序二叉树,平衡二叉树。 二叉树的存储结构 顺序存储结构,将一棵二叉树用0填充成一棵满二叉树,对于每个结点i,双亲结点为floor(i/2),左孩子为2*i,右孩子为2*i+1。 1 //二叉树的顺序存储结构 2 #define MAX_TREE_SIZE 100 3 typedef int SqBiTree[MAX_TREE_SIZE]; 4 SqBiTree bt; 5 6 //二叉树的链式存储结构 7 typedef