叶子结点

树、图、排序查找重要算法(960算法)

匿名 (未验证) 提交于 2019-12-03 00:06:01
设计求T的WPL的算法:   (1) .给出二叉树结点的数据类型定义;   (2) .给出C语言描述算法; 1 typedef struct node { int weight; struct node *left,*right; //指向结点左右子女的指针 }BiNode,*BiTree; 2 int WPL=0; void inorder(BiTree bt,level lv) //bt是二叉树,lv是结点的层次,初值为1 { if(bt) {inorder (bt->left,lv+1); //中序遍历左子树 if(bt->left==null &&bt->right==null) //判断该结点是否为叶子 WPL+=(lv-1)*bt->weight; //累加结点带权路径长度 inorder(bt->right,lv+1); } } NLR void PreOrder(BiTree T){ if(T!=NULL){ visit(T); //访问根结点 PreOrder(T->lchild); //递归遍历左子树 preOrder(T->rchild); } } LNR void InOrder(BiTree T){ if(T!=NULL){ InOrder(T->lchild); visit(T); InOrder(T->rchild); } } LRN void

红黑树和AVL树(平衡二叉树)的定义、特点以及两者的区别

匿名 (未验证) 提交于 2019-12-03 00:05:01
红黑树和AVL树(平衡二叉树)的定义、特点以及两者的区别 定义 性质 区别 定义 AVL树:平衡二叉树又称AVL树,是一种特殊的二叉查找树,其左右子数都是平衡二叉树,且左右子树高度差的绝对值不超过1.一句话表述为:以树中所有结点为根的树的左右子树高度差的绝对值不超过1.将二叉树上结点的左子树深度减去右子树深度称为平衡因子BF,那么平衡二叉树上的所有结点的平衡因子只可能是-1、0和1.只要二叉树上有一个结点的平衡因子的绝对值大于1,该二叉树就是不平衡的。 红黑树:是一种二叉查找树,但在每个结点增加一个存储位表示结点的颜色,可以是红或者黑(非黑即红)。通过对任何一条从根到叶子的路径上各个结点着色的方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因此红黑树是一种弱平衡二叉树,相对于要求严格的AVL树来说,它的旋转次数少,所以对于搜索、插入、删除操作比较多的情况下,通常使用红黑树。 性质 红黑树的性质如下:1.每个结点非红即黑;2.根节点是黑的;3.每个叶节点(叶节点即树尾端NULL指针或NULL结点)都是黑的;4.如果一个结点是红色的,则它的子节点必须是黑色的;5.对于任何结点而言,其到叶子点树NULL指针的每条路径都包含相同数目的黑结点。 区别 区别:AVL树是高度平衡的,频繁的插入和删除,会引起频繁的rebalance,导致效率下降;红黑树不是高度平衡的,算是一种折中

二叉树算法题

匿名 (未验证) 提交于 2019-12-03 00:05:01
二叉树层次遍历 //思路 特殊情况 ,根节点为null,深度为0,return 0 借助队列,队列储存每一层的所有节点, 先保存数组长度,用于控制依次遍历循环――遍历每一个节点保存值,该节点的所有子结点从队尾入队,访问过的节点从头出队 注意――需要先把width存下来,用于for循环的结束标志,因为for循环里面直接操作了queue,不能去都不敢动态获取 队列初始值为root,对每一层都要进行上述遍历――while循环控制,队列空代表叶节点这一层遍历完成,此时遍历结束,退出循环 每次循环开始前初始化一个curNodes储存该层所有节点,每次循环结束,将curNodes压入result var levelOrder = function(root) { if (root === null) return []; //空树 var result = [], queue = [root]; while (queue.length) { let width = queue.length; //需要先把width存下来,用于for循环,for循环里面直接操作了数组 let curNodes = []; for (let i = 0; i < width; i++) { let node = queue.shift(); curNodes.push(node.val); node.left ?

数据结构易错知识点(九推)

匿名 (未验证) 提交于 2019-12-02 23:57:01
写在前面: 这篇博文是为接下来九推的笔面试做准备的,用来记录自己模糊易错的知识点,会不断整理,删掉掌握的,增加不熟悉的,一直更到保研结束为止。 之前整理的一些概要: 数据结构 | 1-5章 数据结构 | 二叉树 数据结构 | 第七章 图 数据结构 | 第八章 查找 数据结构 | 第九章 内部排序 2019.7.19 栈是实现过程和函数等子程序所必需的结构 堆排序是一种树形选择排序,是对直接选择排序的有效改进。 有的非线性结构也可以采用顺序存储结构,比如二叉树 要连通具有n个顶点的有向图,至少需要n条边,无向图的话就是n-1条边 无联系、无序的数据没有必要使用指针相连接,不适合用树表示 数组名当被直接使用时,是一个指向数组首地址的指针。如果数组是多维数组,那么数组名是指向第一行数组的首地址,而不是第一行第一列单个元素的地址,所以 *(a+i)与a[i] 是一个意思,当直接用 a[i] 时代表的是该一维数组的首地址,所以 *(a[i]+j)是与a[i][j] 等效 线性表的两种存储结构有什么优缺点? 顺序存储是按索引(如数组下标)来存取数据元素,优点是可以实现快速的随机存取,缺点是插入与删除将引起元素移动,降低效率。对于链式存储,元素存储采取动态分配,利用率高。缺点是须增设指针域,存储数据元素不如顺序存储方便。有点是插入和删除操作简单,只需修改指针域。

小根堆(Heap)的详细实现

匿名 (未验证) 提交于 2019-12-02 23:57:01
Heap是一种数据结构具有以下的特点: 1)完全二叉树 2)heap中存储的值是偏序 Min-heap: 父节点的值小于或等于子节点的值 Max-heap: 父节点的值大于或等于子节点的值 由于堆存储在下标从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,然后再从根结点开始进行一次从上向下的调整。调整时先在左右儿子结点中找最小的,如果父结点比这个最小的子结点还小说明不需要调整了,反之将父结点和它交换后再考虑后面的结点。相当于从根结点将一个数据的“下沉”过程。 对于叶子节点,不用调整次序,根据满二叉树的性质

数据结构--哈夫曼树

匿名 (未验证) 提交于 2019-12-02 23:56:01
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 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支构成这两个结点之间的路径。 ② 路径长度

Acesrc and Travel(HDU6662+换根dp)

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

luogu P1352 (树形dp)

匿名 (未验证) 提交于 2019-12-02 23:48:02
传送门 给你一棵树,树上的每一个结点都会有一个权值,你可以选取任意多的结点,但是倘若你获取了某个结点 \(a_i\) ,那么他的所有直接儿子就都不会被选取,现在问你最大能够获得的权值。 树形 \(dp\) 的入门题目 首先有一个显然的一点,对于每一个结点都会有选和不选两种方案。我们不妨设 \(dp[x][0/1]\) 。其中 \(dp[x][0]\) 为以结点 \(x\) 为根的子树且不选取当前结点 \(x\) 的权值最大值, \(dp[x][1]\) 为以结点 \(x\) 为根的子树且选取当前结点 \(x\) 的权值最大值。 那么根据题目的意思,倘若没有选取了 \(x\) 结点,那么所有显然所有的儿子结点都可以去选取,而每个儿子都会有取和不取两种状态,因此有转移方程 \(dp[x][0]+=\sum\max(dp[son[x]][0],dp[son[x]][1])\) 而倘若选取了 \(x\) 结点,那么显然儿子的所有结点都不能选,故有状态转移方程 \(dp[x][1]+=\sum(dp[son][0])\) 最后我们只需要获取一下根结点 \(root\) 的记录,因为树存在着递归的性质,因此我们只需要通过 \(dfs\) 从叶子向根进行更新即可,最后的答案为 \(\max(dp[root][1],dp[root][0])\) #include <bits/stdc++.h>

红黑树的插入调整过程(转载)

匿名 (未验证) 提交于 2019-12-02 23:47:01
红黑树的特性: 红黑树中的每个结点包含五个域:color、key、left、right和parent。如果某结点没有一个子结点或父结点,则该结点相应的指针parent域包含值为NIL(NIL并不是空指针,后面会讲到)。把NIL视为指向红黑树的外结点(叶子)的指针,而把带关键字的结点视为红黑树的内结点。红黑树结点结构如下所示: 每个节点或为红色或为黑色。 根节点是黑色。 每个叶子节点(NIL)是黑色。 如果一个节点是候色,那么它的两个儿子都是黑色。 对每个节点,从该节点到其孙子结点的所有路径上包含相同数目的黑色节点。 如下图是一棵红黑树: 旋转 在红黑树上进行结点插入和删除操作时,会改变树的结构形状,导致结果可能不满足了红黑树的某些性质,为了保证每次插入和删除操作后,仍然能报维持红黑树的性质,需要改变树中某些结点的颜色和指针结构。其中的指针结构的改变通过旋转完成的。书中给出了两种旋转:左旋转和右旋转。如下图是旋转过程: 从图可以得出左右旋转的过程,假设对某个结点x进行左旋转,y是x的右孩子,则左旋转过程为:以x和y之间的链为“支轴”进行的,使得x的右孩子为y的左孩子,y的父节点为x的父节点,y的左孩子为x。假设对某个结点y进行右旋转,x是y的左孩子,则右旋转过程为:y的左孩子设置为x的右孩子,将x的父节点设置为y的父节点,x的右孩子设置为y。左旋转的实例如下: 插入

数据结构

匿名 (未验证) 提交于 2019-12-02 23:45:01
一、数据结构基本概念   1、什么是数据结构?     1>数据:数据即信息的载体,是能够输入到计算机中并且能被计算机识别、存储和处理的符号总称。     2>数据元素:数据元素是数据的基本单位,又称之为记录(Record)。一般,数据元素由若干基本项(或称字段、域、属性)组成。     3>数据结构:数据结构指的是数据元素及数据元素之间的相互关系,或组织数据的形式。   2、数据之间的结构关系     1>逻辑结构:表示数据之间的抽象关系(如邻接关系、从属关系等),按每个元素可能具有的直接前趋数和直接后继数将逻辑结构分为“线性结构”和“非线性结构”两大类。     2>存储结构:逻辑结构在计算机中的具体实现方法,分为顺序存储方法、链接存储方法、索引存储方法、散列存储方法。   3、逻辑结构(关系)     1>特点:       (1)只是描述数据结构中数据元素之间的联系规律       (2)是从具体问题中抽象出来的数学模型,是独立于计算机存储器的(与机器无关)     2>逻辑结构分类       (1)线性结构:对于数据结构课程而言,简单地说,线性结构是n个数据元素的有序(次序)集合。           集合中必存在唯一的一个"第一个元素";           集合中必存在唯一的一个"最后的元素";           除最后元素之外,其它数据元素均有唯一的"后继";