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

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'

在这里插入图片描述

希望对大家有帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/568851.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql的多表查询(表添加,多表查询练习:笛卡尔积、内连接、外连接、子查询、UNION组合查询)

https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 如有转载&#xff0c;请注明出处&#xff08;如不注明&#xff0c;盗者必究&#xff09; 目录一、表的创建1.1创建学生表student_one1.2创建教师表t…

Mysql的IF()函数:如果返回True值,返回第一个值,为False值,返回第二个值

IF函数定义 语法 IF(condition, A, B)如果condition为TRUE值&#xff0c;就返回A&#xff0c;如果condition为FALSE值&#xff0c;就返回B。 举例 添加表 create table teacher_one ( tno varchar(20) not null primary key, tname varchar(20) not null, tsex varchar(20…

msyql的FORMAT()函数设置小数位数,将小数位数保留到小数点后第n位,最后一位四舍五入

FORMAT()函数 在mysql的查询中&#xff0c;如果我们输入的是小数类型&#xff0c;而保留几位小数因情况而变&#xff0c;我们可以用FORMAT&#xff08;&#xff09;函数来设置想保留的几位小数。即将数据内容格式化&#xff0c;将数据格式化为整数或者带几位小数的浮点数&#…

import win32com.client在python中报错及其解决办法

在调用import win32com.client的时候出现下面的报错情况 https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 如有转载&#xff0c;请注明出处&#xff08;如不注明&#xff0c;盗者必究&#xff09; …

python怎么安装pandas详细步骤

1.打开cmd&#xff0c;输入 pip install pandas如果pip没有添加到系统变量中去&#xff0c;会出现报错。 具体解决办法参照&#xff1a; https://blog.csdn.net/hanhanwanghaha/article/details/106445654 如图表示已经安装好了pandas 检验&#xff1a; 我们在python中导包…

ping 不是内部或外部命令,也不是可运行的程序 或批处理文件。的解决办法

我们在ping检测网络的时候出现以下报错&#xff1a; ‘ping’ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 让这个可爱的宝…

(原码反码补码的计算)在一个8位的二进制的机器中,补码表示的整数范围是从_(1)_(小)到_(2)_(大)。这两个数在机器中的补码表示为_(3)_(小)到_(4)_(大)。数0的补码为_(5)_。

https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 如有转载&#xff0c;请注明出处&#xff08;如不注明&#xff0c;盗者必究&#xff09; 目录题目分析过程补充&#xff08;反码、补码及进制转换&a…

实用一位加法电路-全加器(全加器真值表、全加器的逻辑组合电路)、几种基本组合逻辑电路真值表 补充:逻辑电路基础:与门、或门、非门----计算机组成原理

https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 如有转载&#xff0c;请注明出处&#xff08;如不注明&#xff0c;盗者必究&#xff09; 目录一、全加器的真值表二、全加器逻辑组合电路的构建三、…

Connected to the target VM, address: ‘127.0.0.1:0‘, transport: ‘socket‘ Disconnected from the target

报错情况&#xff1a; 翻译过来是&#xff1a; 已连接到目标VM&#xff0c;地址&#xff1a;“127.0.0.1:0”&#xff0c;传输&#xff1a;“socket”已断开与目标VM的连接&#xff0c;地址&#xff1a;“127.0.0.1:0”&#xff0c;传输&#xff1a;“socket” 在网上找了很多…

Python单元测试介绍及单元测试理解,单元测试的自动生成(对函数进行测试)

目录一、单元测试的定义二、实例理解2.1可通过的测试一个模拟的登录测试用例测试代码运行结果2.2不可通过的测试一个模拟的登录测试用例测试代码运行结果三、单元测试的自动生成https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&…

怎样彻底卸载软件?解决卸载残余?例如:总跳出Xftp 6.msi安装-Xftp 6无法访问你试图使用的功能所在的网络位置,单击“确定”重试,或在下面的框中输入包含安装程序包“Xftp 6.msi”文件

问题重述 最近电脑总是跳出这样的消息&#xff0c;这是我们的Xftp没有卸载干净导致的。 https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 让这个可爱的宝藏女孩在努力的道路上与你一起同行&#…

Python字典(Dictionary)的setdefault()方法的详解,字典中的赋值技巧

定义 1.字典的setdefault() 方法和 get()方法类似,返回指定键的值&#xff0c;如果键不在字典中&#xff0c;将会添加键值对&#xff0c;值默认为None。 2.setdefault()与get()区别&#xff1a; setdefault() 返回的键如果不在字典中&#xff0c;会添加键&#xff08;更新字典…

数据结构--队列、双端队列实际举例详解(Python代码)

https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 让这个可爱的宝藏女孩在努力的道路上与你一起同行&#xff01; 如有转载&#xff0c;请注明出处&#xff08;如不注明&#xff0c;盗者必究&#xf…

pythonselenium一个简单的自动化测试实战:百度搜索

目录前提准备1. Chrome浏览器的安装2. chrome浏览器下载驱动地址及Chrome的版本号查看3.下载chrome浏览器驱动4.下载安装selenium代码PC端移动端前提准备 1. Chrome浏览器的安装 2. chrome浏览器下载驱动地址及Chrome的版本号查看 这里驱动的作用&#xff1a;我们写的代码通…

递归算法(python),汉诺塔问题,斐波那契数列,一个简单的递归实例,用递归实现阶乘,用递归查看目录及文件

https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 让这个可爱的宝藏女孩在努力的道路上与你一起同行&#xff01; 如有转载&#xff0c;请注明出处&#xff08;如不注明&#xff0c;盗者必究&#xf…

python run之后出现>>> runfile(‘F:xxx.py‘, wdir=‘F:xxx‘) 快速干掉它的办法

运行结果 F:\Z\Python\install\Anaconda\envs\admin\python.exe "F:\Z\Python\install\pycharm\installPYcharm\PyCharm 2020.1\plugins\python\helpers\pydev\pydevconsole.py" --modeclient --port58318 PyDev console: starting. >>> runfile(F:/Z/Pyth…

matplotlib的基本使用 附python代码详细讲解(基本图的绘制、样式、简单函数的使用)

目录一、基本图的绘制1.1直线的绘制1.2折线的绘制1.3散点图的绘制1.4绘制不同颜色的散点图1.5绘制不同颜色的线1.6柱状图1.7饼状图1.8直方图1.9三维图1.10等高线图二、样式2.1基本样式2.2画布分区的使用三、函数3.1简单的一元二次方程3.2三角函数一、基本图的绘制 1.1直线的绘…

算法的时间复杂度(python版容易理解)+常用的时间复杂度、python代码--数据结构

https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 如有转载&#xff0c;请注明出处&#xff08;如不注明&#xff0c;盗者必究&#xff09; 目录一、算法时间复杂度的应用二、如何计算算法的时间复杂…

python小白如何看报错?实用三步法

https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 如有转载&#xff0c;请注明出处&#xff08;如不注明&#xff0c;盗者必究&#xff09; 怎么正确看报错&#xff1f;拿一段代码来说事&#xff1a;…

测试必备:单元测试测试类,以帮助匿名管理调查的类为例详解--白盒测试

类的测试与函数的测试相似 测试函数的案例&#xff1a;https://blog.csdn.net/hanhanwanghaha/article/details/107487037 https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注&#xff01; 欢迎关注微信公众号&#xff1a;宝藏女孩的成长日记 让这个可爱的宝藏女孩在努…