欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > python >内容正文

python

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

发布时间:2025/3/15 python 33 豆豆
生活随笔 收集整理的这篇文章主要介绍了 哈夫曼树(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'

希望对大家有帮助!

创作挑战赛新人创作奖励来咯,坚持创作打卡瓜分现金大奖

总结

以上是生活随笔为你收集整理的哈夫曼树(Huffman Tree)的介绍、画法、哈夫曼树的可视化显示(Python代码实现)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。