最优二叉树

数据结构TIRE 树实际应用----过滤禁词

二次信任 提交于 2020-04-08 12:27:27
二叉树也是 递归 定义的,其结点有左右子树之分: (1) 完全二叉树 ——若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层有 叶子结点 ,并且叶子结点都是从左到右依次排布,这就是 完全二叉树 。 (2) 满二叉树 ——除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。 (3) 深度——二叉树的层数,就是高度。 1、二叉树的存储结构 (1)顺序存储结构(适合完全二叉树和满二叉树) (2)链式存储结构(适合非完全二叉树) 2、二叉树的遍历 (1)递归遍历(中序遍历、先序遍历、后序遍历) (2)非递归遍历(利用堆栈实现) 3、二叉树的拓展 (1)线索二叉树(在节点空指针域存放前驱和后继节点的指针,加上线索标志域区分是线索指针还是child指针;建立线索二叉树,实质上就是遍历一颗二叉树,在相应的指针域进行操作) (2)二叉排序树(了解生成过程) (3)最优二叉树(哈夫曼树):对于一组有确定权值的叶子节点,构造的具有最小带权路径长度的二叉树(典型应用:哈夫曼编码) (3)平衡树: 它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。(防止退化为链表,提高搜索效率) (4)红黑树:红黑树是平衡二叉树的一种;它有很好的性质,树中的结点都是有序的,而且因为它本身就是平衡的

[Luogu P5018] 对称二叉树

我们两清 提交于 2020-03-27 02:17:30
原题链接qwq \(Structure\) 本题作为 \(PJ\ T4\) 其实还是历届以来较简单的 题目相信大家已经读过了,就是让我们找出一棵二叉树中具有最多结点的对称子树。 但肯定会有很多人审题不清楚而导致没有弄清对称子树的概念(可能是时间也不够扒) 下面就来给大家讲(胡)解(扯)一下 在上图中,我们可以看出,子树既可以是根节点和叶节点组成,也可以是一个节点, 如图中绿色笔圈出的就是一棵树。在比赛中,有很多选手将对称子树理解成:一棵树 中的一部分为对称(如图中蓝色笔和粉色笔圈出的)。但实际上这棵树的正解确是由 红笔圈出的子树!!可见题意中的对称二叉子树是必须由一个根节点一直到树的最底 部所组成的树。 \(Solution\) 这样一来就简单了,我们很容易就能想到用递归的方法 1.枚举根节点,判断其左右两个孩子节点 是否存在 以及 是否相等 . 若存在并且点权相等,则一直递归 左右两个孩子节点 的 左右两个孩子节点 . 重复上述判断。 2.判断好对称二叉树后,就可以计算以该节点为根节点的对称二叉子树的节点数量并取最优值了。 \(Code\) #include <bits/stdc++.h> #define ll long long const int maxn = 2000000; using namespace std; ll a[maxn], l[maxn], r[maxn]

树与二叉树 | 哈夫曼树

半世苍凉 提交于 2020-03-12 04:43:33
哈夫曼树定义 (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* 80 + 3* 20 + 3* 10 = 100 + 160 + 60 + 30 = 350。 哈夫曼树 哈夫曼树又称最优二叉树。它是 n 个带权叶子结点构成的所有二叉树中,带权路径长度 WPL 最小的二叉树。 哈夫曼树的构造过程: 给定的n个权值{W1,W2,…,Wn}构造n棵只有一个叶结点的二叉树,从而得到一个二叉树的集合F={T1,T2,…,Tn}。 在F中选取根结点的权值最小和次小的两棵二叉树作为左、右子树构造一棵新的二叉树

走远了吗. 提交于 2020-03-11 10:57:34
树是由结点或顶点和边组成的(可能是非线性的)且不存在着任何环的一种数据结构。 基本概念 : 1)兄弟结点——拥有同一个父结点的结点; 2)孩子、双亲——结点的子树的根称为该节点的孩子,相应地,该节点称为孩子的双亲; 3)结点的度——一个结点所包含子树的数量; 4)树的度——该树所有结点中最大的度; 5)叶子结点——树中度为零的结点,也叫终端结点; 6)结点的层数——从根结点开始算,根结点是第一层,依次往下。 7)树的深度——树中结点的最大层数 8)有序树——树中的各结点的 子树(兄弟结点 )从左到右按一定次序去排列的树; 9)森林—— m(m>=0) 棵 互不相交 的树的集合。    存储结构: 1)双亲表示法——在每个结点的结构中,附设一个字段记录其双亲结点在数组中的位置 结点结构如图 : , data是数据域,存储节点的数据信息,parent是指针域,存储该节点的双亲在数组中的下标 /*树的双亲表示法节点结构定义*/ #define MAX_TREE_SIZE 100 typedef int TElemType /*树结点数据类型,目前暂定为整型*/ typedef struct PTNode/*结点数据结构*/ { TElemType data; /*结点数据*/ int parent; /*双亲位置*/ }PTNode; typedef struct/*树结构*/ {

实现哈夫曼树(最优二叉树)

余生长醉 提交于 2020-03-05 18:39:13
public class HuffmanTree { //节点 public static class Node<E> { E data; //数据 int weight; //权重 Node leftChild; //左子节点 Node rightChild;//右子节点 public Node(E data, int weight) { super(); this.data = data; this.weight = weight; } public String toString() { return "Node[" + weight + ",data=" + data + "]"; } } public static void main(String[] args) { List<Node> nodes = new ArrayList<Node>(); //把节点加入至list中 nodes.add(new Node("a", 10)); nodes.add(new Node("b", 15)); nodes.add(new Node("c", 12)); nodes.add(new Node("d", 3)); nodes.add(new Node("e", 4)); nodes.add(new Node("f", 13)); nodes.add(new Node("g"

纵饮孤独 提交于 2020-02-28 21:56:12
树 树的概念 树的特点 【1】每个节点有零个或多个子节点; 【2】没有父节点的节点称为根节点; 【3】每一个非根节点有且只有一个父节点; 【4】除了根节点外,每个子节点可以分为多个不相交的子树; 树的术语 【1】节点的度:一个节点含有的子树的个数称为该节点的度; 【2】树的度:一棵树中,最大的节点的度称为树的度; 【3】叶节点或终端节点:度为零的节点; 【4】父亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 【5】孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点; 【6】兄弟节点:具有相同父节点的节点互称为兄弟节点; 【7】节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推; 【8】树的高度或深度:树中节点的最大层次; 【9】堂兄弟节点:父节点在同一层的节点互为堂兄弟; 【10】节点的祖先:从根到该节点所经分支上的所有节点; 【11】子孙:以某节点为根的子树中任一节点都称为该节点的子孙。 【12】森林:由m(m>=0)棵互不相交的树的集合称为森林; 树的种类 【1】无序树:树中任意节点的子节点之间没有顺序关系,这种树称为无序树,也称为自由树; 【2】有序树:树中任意节点的子节点之间有顺序关系,这种树称为有序树; 【3】二叉树:每个节点最多含有两个子树的树称为二叉树; 【4】完全二叉树:对于一颗二叉树,假设其深度为d(d>1)

基于huffman树的文件压缩项目

流过昼夜 提交于 2020-02-26 02:26:13
压缩原因 1.文件太大,节省空间 2.提高数据在网络上传输的效率 3.对数据起到保护作用---加密 文件压缩类型 无损压缩:源文件被压缩之后,可以通过解压缩还原成与源文件相同的格式 有损压缩:源文件被压缩之后,解压缩无法还原成与源文件相同,但识别其内容没有影响,多用于语音,图片,视频压缩 基于Huffman树的压缩如何实现 通过Huffman编码实现,字符一般都是以字节存储的,通过编码转换为二进制编码(1字节=8比特位) 首先,什么是Huffman树 给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。 例如:给定权值为1(A),3(B),5(C),7(D)四个节点,构建Huffman树 Huffman压缩原理 --基于Huffman编码 以字符串中每个字符出现的次数为权值构建Huffman树 从根节点开始,左分支为0,右分支为1,如上图 所有权值节点都在叶子节点位置,遍历每条到叶子节点的路径获取字符的编码 举个栗子:ABBBCCCCCDDDDDDD Huffman编码: A:100 B:101 C:11 D:0 原理就是这么简单,一个字符占一个字节,现在用二进制编码代替之后,一个字符只占三位,也就是说一个字节可以表示两三个字符,所以说一次压缩

P1040 加分二叉树

徘徊边缘 提交于 2020-02-21 11:35:51
题目链接 P1040 加分二叉树 题目梗概 我们知道中序遍历相同的二叉树可能有很多种,请在满足给定的中序遍历的二叉树中,找出得分最小二叉树,输出它的得分和前序遍历。 得分规则:树的得分 = 左子树的得分 * 右子树的得分 + 根节点的得分。 特别的,若没有左(右)子树,则左(右)子树得分为1。 若为叶子节点,则得分就是叶子节点的分数。 注:题目中给出的中序遍历是每个结点上的分数,并非结点编号,输入序号即为结点编号。 需要输出的前序遍历中,要的是结点编号,而非结点分数。 解题思路 搜索所有可能的二叉树,得到最优的结果。 搜索问题 我们知道中序遍历是由三部分组成,即左子树,根结点,右子树。当我们选择了根节点之后,左边的就是左子树的中序遍历,右边的就是右子树的中序遍历。 如果我们不考虑左子树,右子树它们各自的内部结构,那么对于一棵二叉树而言,把根节点的所有可能都搜索一边,那就相当于把这棵树所有可能都搜索一边。借用递归思想,我们分别对左右子树进行相同的操作,那最终就可以真正得把所有可能的二叉树都搜索完毕。 记忆化搜索问题 这里建立dp数组,就是把当前情况计算后的结果存储下来,当下一次再遇到同样情况时,可以直接获取结果,避免重复搜索计算。 例如对于总序列 [1,2,3,4,5] 中的子序列 [1,2] 。 我们会在以3为一级根节点时, [1,2] 会被作为一级左子树计算一遍。

哈夫曼树(最优二叉树)、哈夫曼编码

冷暖自知 提交于 2020-01-25 15:58:49
在此祝大家新年快乐,新的一年守住头发,不断进步! 哈夫曼树 一、哈夫曼树基本概念 二、哈夫曼树的构造算法 三、哈夫曼构造算法的实现 四、哈夫曼编码 五、哈夫曼编码的算法实现 一、哈夫曼树基本概念 (1) 路径 :从树中的一个结点到另一个结点之间的分支构成这两个结点之间的路径 (2) 路径长度 :路径上的分支数目称作路径长度。 (3) 树的路径长度 :从树根到每一结点的路径长度之和。 (4) 权 :将树中结点赋给一个有着某种含义的数值,则这个数值称为该 结点的权 。 (5) 结点的带权路径长度 :从 根结点 到该结点之间的 路径长度 与该结点的 权 的 乘机 (6) 树的带权路径长度 :树中所有 叶子结点 的 带权路径长度之和。 看以下几个例子: 我们可以总结出: 哈夫曼树:最优二叉树(带权路径长度(WPL)最短的二叉树) ,带权路径长度最短是在“度相同”的树中比较而得的结果,因此有最优二叉树、最优三叉树之称。 满二叉树不一定是哈夫曼树 哈夫曼树中权越大的叶子离根越近 具有相同带权结点的哈夫曼树不唯一 根据 权值越大的结点离根结点越近 这个特点,哈夫曼最早给出了一个构造哈夫曼树的方法,称为 哈夫曼算法 二、哈夫曼树的构造算法 典型的贪心算法:构造哈夫曼树时首先选择权值小的叶子结点。 哈夫曼算法(构造哈夫曼树的方法) (1)根据n个给定的权值{w1,w2,w3…,wn

最优二叉树

瘦欲@ 提交于 2019-12-29 16:54:54
叶子结点的权值 :对叶子结点赋予的一个有意义的数值量。 二叉树的带权路径长度 :设二叉树具有n个带权值的叶子结点,从根结点到各个叶子结点的路径长度与相应叶子结点权值的乘积之和。 记为: 哈夫曼树 :给定一组具有确定权值的叶子结点,带权路径长度最小的二叉树。 哈夫曼树的特点 : 权值越大的叶子结点越靠近根结点,而权值越小的叶子结点越远离根结点。 只有度为0(叶子结点)和度为2(分支结点)的结点,不存在度为1的结点. 哈夫曼算法基本思想: ⑴ 初始化:由给定的n个权值{w1,w2,…,wn}构造n棵只有一个根结点的二叉树,从而得到一个二叉树集合F={T1,T2,…,Tn}; ⑵ 选取与合并:在F中选取根结点的权值最小的两棵二叉树分别作为左、右子树构造一棵新的二叉树,这棵新二叉树的根结点的权值为其左、右子树根结点的权值之和; ⑶ 删除与加入:在F中删除作为左、右子树的两棵二叉树,并将新建立的二叉树加入到F中; ⑷ 重复⑵、⑶两步,当集合F中只剩下一棵二叉树时,这棵二叉树便是哈夫曼树。 哈夫曼树的存储结构 设置一个数组huffTree[2n-1]保存哈夫曼树中各点的信息,数组元素的结点结构 。 数组huffTree初始化,所有元素结点的双亲、左 右孩子都置为-1; 数组huffTree的前n个元素的权值置给定值w[n]; 进行n-1次合并 3.1 在二叉树集合中选取两个权值最小的根结点,