最优二叉树(哈夫曼树)

预备知识:

  路径:从树中一个结点到另一个结点之间的通路,路径上的分支数目成为路径长度;

   树的路径长度:从树根到每一个叶子之间的路径长度之和;

  结点的带权路径长度:从该结点到树根之间的路径长度与该结点权值的乘积;

  树的带权路径长度:所有叶子结点的带权路径长度之和;

  结构相同的任意两颗二叉树,由于他们的叶子结点权值可能不同,所以他们的带权路径长度也会不同;哈夫曼树是指带权路径长度最小的二叉树;

构造哈夫曼树的方法:

  假设有一组权值{5,29,7,8,14,23,3,11},下面我们将利用这组权值演示构造哈夫曼树的过程。

  第一步:以这8个权值座位根节点的权值构造具有8棵树的森林;

  

  第二步:从中选择两个根的权值最小的树3,5座位左右子树构成一棵新树,新树根节点的权值为3+5,并将这两棵树从森林中删除,并将新树添加进去;

  第三步:重复第二步过程,直到森林中只有一棵树为止,此处选择7,8;

  第四步:

  第五步:

  第六步:

  第七步:

哈夫曼编码:

哈夫曼树中只存在叶子节点和度为2的结点。叶子节点的个数=度为2的节点数+1。

时间: 2024-10-10 15:35:54

最优二叉树(哈夫曼树)的相关文章

基础数据结构-二叉树-赫夫曼树的解码(详解)

本篇是上一篇赫夫曼树构建与编码的后续,稍微详细讲一下解码的算法. Huffman解码算法流程: 1.定义指针p指向赫夫曼树结点,实际是记录结点数组的下标: 2.定义指针i指向编码串,定义ch逐个取编码串的字符: 3.初始化:读入编码串,设置p指向根结点,i为0: 4.执行以下循环: a)取编码串的第i个字符放入ch: b)如果ch是字符0,表示往左孩子移动,则p跳转到右孩子: c)如果ch是字符1,表示往右孩子移动,则p跳转到右孩子: d)如果ch非0非1,表示编码串有错误,输出error表示解

树/二叉树(哈夫曼树/红黑树)笔记

1.树是一种常用数据结构,它是非线性结构. 2.树中任一普通节点可以有0或者多个子节点,但只能有一个父节点. 根节点没有父节点, 叶子节点没有子节点. 3.二叉树: 1)每个节点最多只能有两个子树的有序树 2)左边的子树称为左子树 3)右边的子树成为右子树 4)一棵深度为k的二叉树,如果它包含了(2^k-1)个节点,就把这棵二叉树称为满二叉树 4.满二叉树的特点: 1)每一层上的节点数都是最大节点数,即各层为1,2,4,8,16 .... (2^k-1) 2)一棵有n个节点的二叉树,按满二叉树的

13.赫夫曼树及其应用

一.赫夫曼树定义与原理 1.路径长度:从树中一个结点到另一个结点之间的分支构成两个结点之间的路径,路径上的分支数目称作路径的长度; 2.树的路径长度:即从树根到每一结点的路径长度之和; 3.结点的带权的路径长度:即从该结点从到树根之间的路径长度与结点上权的乘积; 4.树的带权路径长度:为树中所有叶子结点的带权路径长度之和; 5.赫夫曼树定义:假设有n个权值{w1,w2,....,wn},构造一颗有n个叶子结点的二叉树,每个叶子结点带权wk,每个叶子的路径长度为lk,则其中带权路径长度WPL最小的

数据结构学习笔记04树(堆 哈夫曼树 并查集)

一.堆(heap) 优先队列(Priority Queue):特殊的“队列”,取出元素的顺序是依照元素的优先权(关键字)大小,而不是元素进入队列的先后顺序. 数组 : 插入 — 元素总是插入尾部 ~ O ( 1 ) 删除 — 查找最大(或最小)关键字 ~ O ( n ) 从数组中删去需要移动元素 ~ O( n ) 链表: 插入 — 元素总是插入链表的头部 ~ O ( 1 ) 删除 — 查找最大(或最小)关键字 ~ O ( n ) 删去结点 ~ O( 1 ) 有序数组: 插入 — 找到合适的位置

数据结构_哈夫曼树

基本概念 路径:在一棵树中,从任意一个结点到达另一个结点的通路 路径长度:该路径所需经过的边的个数 带权路径长度:从根结点到达该节点的路径长度再乘以该结点权值的结果 带权路径长度和:树所有的叶子结点的带权路径长度和 哈夫曼树:给定n个带权值结点,以它们为叶子结点构造的一棵带权路径和最小的二叉树 哈夫曼树的求法 将所有结点放入集合 K. 若集合 K 中剩余结点大于 2 个,则取出其中权值最小的两个结点,构造他们同时为某个新节点的左右儿子,该新节点是他们共同的双亲结点,设定它的权值为其两个儿子结点的

最优二叉树(霍夫曼树)分析

 1.树的路径长度     树的路径长度是从树根到树中每一结点的路径长度之和.在结点数目相同的二叉树中,完全二叉树的路径长度最短. 2.树的带权路径长度(Weighted Path Length of Tree,简记为WPL) 结点的权:在一些应用中,赋予树中结点的一个有某种意义的实数. 结点的带权路径长度:结点到树根之间的路径长度与该结点上权的乘积. 树的带权路径长度(Weighted Path Length of Tree):定义为树中所有叶结点的带权路径长度之和,通常记为: 其中: n

javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题

赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支构成这两个结点之间的路径. ② 路径长度:结点路径上的分支数目称为路径长度. ③ 树的路径长度:从树根到每一个结点的路径长度之和. 以下图为例: A到F :结点路径 AEF : 路径长度(即边的数目) 2 : 树的路径长度:3*1+5*2+2*3=19: ④ 结点的带权路径长度:从该结点的到树的根结

哈夫曼树(最优二叉树)及哈夫曼算法

哈夫曼树 在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUFFMAN)树和哈夫曼编码.哈夫曼编码是哈夫曼树的一个应用.哈夫曼编码应用广泛,如JPEG中就应用了哈夫曼编码. 首先介绍什么是哈夫曼树.哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树.所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数).树的带权路径长度记为WPL=(W1*L1+W2*L2+W3*L3+...+Wn*Ln),N个权

哈夫曼树(最优二叉树)的创建

哈夫曼树是带权路径最小的一种特殊二叉树,所以也称最优二叉树. 在这里不讨论基本概念如怎样计算路径等,而仅仅着重于树的创建,详细过程让我们举例而言. 其主要的原理为:将全部节点一開始都视为森林.每次从森林中选取两个根节点权值最小的树合并为一棵新树,新树的根节点大小为两个子节点大小的和,并将这棵新树又一次增加到森林中. 如此一来每一轮操作都能够简化为两个基本操作:合并两棵树.插入新树,直到森林中仅仅剩下一棵树,即是哈夫曼树. 以7个节点的权值分别为 1 3 7 9 12 18 25而言 创建的第一步

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

一.定义 一些定义: 节点之间的路径长度:在树中从一个结点到另一个结点所经历的分支,构成了这两个结点间的路径上的经过的分支数称为它的路径长度 树的路径长度:从树的根节点到树中每一结点的路径长度之和.在结点数目相同的二叉树中,完全二叉树的路径长度最短. 结点的权:在一些应用中,赋予树中结点的一个有某种意义的实数. 结点的带权路径长度:结点到树根之间的路径长度与该结点上权的乘积. 树的带权路径长度(Weighted Path Length of Tree:WPL):定义为树中所有叶子结点的带权路径长