https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注!
欢迎关注微信公众号:宝藏女孩的成长日记
如有转载,请注明出处(如不注明,盗者必究)

目录

  • 一、概念
  • 二、带权路径长度
  • 三、树的带权路径长度
  • 四、举例
  • 五、哈夫曼树画法举例举例理解
    • 5.1步骤
    • 5.2注意
  • 六、举例(代码实现)
    • 6.1代码
    • 6.2运行结果
  • 注意

一、概念

带权路径长度最短的二叉树,即最优二叉树。

二、带权路径长度

在一颗树中,叶子结点带有数值,这个数值叫做权值,

权值与叶子结点到根节点层数的乘积=带权路径长度

三、树的带权路径长度

树中所有叶节点的带权路径长度之和

四、举例


树的带权路径长度计算:3x1+5x2=13

五、哈夫曼树画法举例举例理解

5.1步骤

(1) 先准备一组数字,以5,7,5,8, 9,2, 3为例
(2) 对这一组数字进行从小到大的规则排序,排序结果为2, 3, 5 ,5, 7, 8, 9
(3) 在2, 3, 5 ,5, 7, 8, 9这些数字中,选择两个最小的数字2,3
(4) 用类似树杈的“树枝”连接两个最小的数,在顶点处计算出这两个数字的和,比较剩下的数字和这个和的大小,再取出两个最小的数字进行排序。
排序结果如下:

5.2注意

1.如果两个数的和等于是下一步两个最小数其中一个,那么这个树直接往上生长。如上图的5,5,左边的5直接向上生长。如果两个数的和比较大,不是下一步两个最小数其中一个,那么就并列生长,例如我们的左边5,5的和为10,而10不等于接下来选出的两个数字5,7,所以要另外开一棵二叉树。

2.一个节点只能生成两个分支。

六、举例(代码实现)

要求:将2, 3, 5 ,5, 7, 8, 9画出来

6.1代码

#coding=utf-8
import pygraphviz as pgv
import cv2
import os
import tkinter as tkIndex = 0#  二叉树
class BTree:lchild = Nonerchild = Nonedata = 0index = 0def __init__(self, data, index):self.data = dataself.index = indexreturndef getchild(self, lc, rc):self.lchild = lcself.rchild = rcreturn#  用来预处理哈夫曼树
def PreHuffTree(bt, dot):if (bt == None): returndot.add_node(bt.index, label=str(bt.data))PreHuffTree(bt.lchild, dot)PreHuffTree(bt.rchild, dot)if (bt.lchild != None):dot.add_edge(bt.index, bt.lchild.index, )if (bt.rchild != None):dot.add_edge(bt.index, bt.rchild.index)return#  str转换为int类型
def GetSomeValue(hl):global Indexht = []for x in range(len(hl)):ht.append(BTree(int(hl[x]), Index))Index += 1return ht#  对数据进行连接形成二叉树
def TransFromHuffTree(hl):global Indexif (len(hl) == 0):print("未输入数值")returnwhile len(hl) > 1:hl = sorted(hl, key=lambda x: x.data)hf = BTree(hl[0].data + hl[1].data, Index)Index += 1hf.getchild(hl[0], hl[1])hl.pop(0)hl.pop(0)hl.append(hf)return hl[0]if __name__ == "__main__":HuffTreelist = []root = tk.Tk()values = ""HuffTreelist = []tk.Label(root, text='请输入一系列数值,以空格间隔 :').grid(row=0, column=0)  # 对Label内容进行 表格式 布局v1 = tk.StringVar()e1 = tk.Entry(root, textvariable=v1)e1.grid(row=0, column=1, padx=10, pady=5)def GetValue():global values, HuffTreelist, v1values = v1.get()values = values.split()for x in range(len(values)):if not values[x].isnumeric():v1.set("输入错误:包含非数字字符")breakreturntk.Button(root, text='确认', width=10, command=GetValue).grid(row=1, column=0, sticky=tk.W, padx=10, pady=5)tk.Button(root, text='退出', width=10, command=root.quit).grid(row=1, column=1, sticky=tk.E, padx=10, pady=5)tk.mainloop()root.destroy()HuffTreelist = GetSomeValue(values)HuffTree = TransFromHuffTree(HuffTreelist)dot = pgv.AGraph(directed=False, strict=True)PreHuffTree(HuffTree, dot)dot.layout('dot')dot.draw('d:/b.png')pic = cv2.imread('d:/b.png')cv2.imshow("hufftree", pic)cv2.waitKey(0)os.remove('d:/b.png')

代码参考:https://blog.csdn.net/qq_41654225/article/details/101302587
运行结果:

注意
要以空格分隔,否则

注意
只能输入数字,否则

正确输入2 3 5 5 7 8 9 ,点击确认,再点击退出

6.2运行结果

注意

如果pycharm没有进行管理员运行,会出现以下报错:

Traceback (most recent call last):File "F:/自动化测试工具/Pycharm的项目/model/teacher.py", line 107, in <module>dot.draw('d:/b.png')File "F:\Python\lib\site-packages\pygraphviz\agraph.py", line 1518, in drawfh = self._get_fh(path, 'w+b')File "F:\Python\lib\site-packages\pygraphviz\agraph.py", line 1547, in _get_fhfh = open(path, mode=mode)
PermissionError: [Errno 13] Permission denied: 'd:/b.png'

希望对大家有帮助!

哈夫曼树(Huffman Tree)的介绍、画法、哈夫曼树的可视化显示(Python代码实现)相关推荐

  1. 哈夫曼树(Huffman Tree),与哈夫曼编码

    目录 一.哈夫曼树 1.什么是哈夫曼树? 2.哈夫曼树关键字说明 3.用代码实现哈夫曼树思路分析 4.代码实现 二.哈夫曼编码 1.哈夫曼编码基本介绍 2.原理剖析 3.代码实现 一.哈夫曼树 1.什 ...

  2. 数据结构C#版笔记--啥夫曼树(Huffman Tree)与啥夫曼编码(Huffman Encoding)

    哈夫曼树Huffman tree 又称最优完全二叉树,切入正题之前,先看几个定义 1.路径 Path 简单点讲,路径就是从一个指定节点走到另一个指定节点所经过的分支,比如下图中的红色分支(A-> ...

  3. 哈夫曼树(Huffman Tree)

    定义 哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树.所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数).树的路 ...

  4. 【数据结构与算法】-哈夫曼树(Huffman Tree)与哈夫曼编码

    超详细讲解哈夫曼树(Huffman Tree)以及哈夫曼编码的构造原理.方法,并用代码实现. 1哈夫曼树基本概念 路径:从树中一个结点到另一个结点之间的分支构成这两个结点间的路径. 结点的路径长度:两 ...

  5. 霍夫曼树:霍夫曼编码(Huffman Tree:Huffman Coding)

    一.简介 霍夫曼树常处理符号编写工作.根据整组数据中符号出现的频率高低,决定如何给符号编码.如果符号出现的频率越高,则给符号的码越短,相反符号的号码越长. 相关术语 路径:从书中一个节点到另一个节点之 ...

  6. 隐马尔科夫模型,第三种问题解法,维比特算法(biterbi) algorithm python代码

    上篇介绍了隐马尔科夫模型 本文给出关于问题3解决方法,并给出一个例子的python代码 回顾上文,问题3是什么, 下面给出,维比特算法(biterbi) algorithm 下面通过一个具体例子,来说 ...

  7. Python---哈夫曼树---Huffman Tree

    今天要讲的是天才哈夫曼的哈夫曼编码,这是树形数据结构的一个典型应用. !!!敲黑板!!!哈夫曼树的构建以及编码方式将是我们的学习重点. 老方式,代码+解释,手把手教你Python完成哈夫曼编码的全过程 ...

  8. java哈夫曼_用 JAVA 实现哈夫曼树(Huffman Tree)

    -1. 什么是树 树是一种 有层次关系的 数据结构.它由结点组成. 图一: 树的结点由 数据域 和 子结点域 组成.数据域 作为数据的容器:子结点域 存放 子结点 的地址.一个结点是它的子结点的父结点 ...

  9. java 实现部门树_(java实现)哈夫曼(Huffman)树编码(自编压缩项目基础)

    哈夫曼树 给定 n 个权值作为 n 个叶子结点,构造一棵二叉树, 若该树的带权路径长度(wpl) 达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree), 也叫霍夫曼树. 哈 ...

最新文章

  1. C malloc 用法
  2. 用tolower()和toupper()来实现对string进行大小写转换
  3. vue 定义全局弹框_用vue/react写一个全局提示弹框
  4. [渝粤教育] 重庆大学 电子商务 参考 资料
  5. pandas和 excel 尝试
  6. 语言防止鼠标连点_全球化设计系列 | 多语言设计的“小锦囊”
  7. sparkpython多线程_如何在PySpark(Spark流)中组合多个rdd?
  8. NextArch Foundation 下一代架构基金会
  9. Tao Admin免费开源后台管理系统
  10. 智慧城市专题视频课程 附教案
  11. 常用的数据库统计SQL语句(2)
  12. Android Jni 调用
  13. Conflux 请你“出名”啦!
  14. AI创业哪家强?6大选择给你方向!
  15. The Code is successfully generated under(文件路径) but MDK-ARM V5project generation have a problem.
  16. 项目管理软件选型【OA与项目管理】
  17. linux tomcat 开发js,tomcat9-windows-服务版JS文件乱码
  18. mysql手机号码不重复吗_如何批量生成MySQL不重复手机号大表实例代码
  19. 正常测量DC/DC模块的电源纹波指标
  20. win10进行安装使用11ie浏览器——遇到问题合集解决(执行一遍、问题解决)

热门文章

  1. mysql查询姓王的信息代码_MySQL查询语句练习题
  2. Linux 中使用 sort 指令分组排序详解
  3. java数据库程序实例_Java连接各种数据库的实例大全
  4. 二进制编译安装mysql_二进制编译安装mysql
  5. 腾讯x5加载本地html乱码,腾讯X5内核播放器遇到的问题
  6. java多个mapreduce_java – 在hadoop中运行多个MapReduce作业
  7. 计算机硬件知识教学的信息化手段,《计算机硬件组成》教学设计
  8. python 如何匹配列表中某个单词_Python中部分指定单词的最佳匹配项
  9. pitr 原理_PostgreSQL基于时间点恢复(PITR)
  10. html玫瑰花效果代码,html5渲染3D玫瑰花情人节礼物js特效代码