哈夫曼树可视化显示 Python

用pygraphviz显示二叉树

用tk做可视化界面

cv2显示图片

临时拼凑的代码

pygraphviz 没有找到显示图片的代码,就用opencv imshow来显示了,如果哪个地方不尽人意还请多多包涵,或提醒我进行改善

pygraphviz 适用于python3.x版本的: https://github.com/CristiFati/Prebuilt-Binaries/tree/master/Windows/PyGraphviz

下载之后用pip install 安装

import pygraphviz as pgv
import cv2
import os
import tkinter as tk

Index = 0

#  二叉树
class BTree:
    lchild = None
    rchild = None
    data = 0
    index = 0
    def __init__(self,data,index):
        self.data = data
        self.index = index
        return
    def getchild(self,lc,rc):
        self.lchild = lc
        self.rchild = rc
        return

#  用来预处理哈夫曼树
def PreHuffTree(bt,dot):
    if(bt == None): return

    dot.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 Index
    ht = []
    for x in range(len(hl)):
            ht.append(BTree(int(hl[x]),Index))
            Index += 1
    return ht

#  对数据进行连接形成二叉树
def TransFromHuffTree(hl):
    global Index
    if(len(hl) == 0): 
        print("未输入数值")
        return
    while len(hl)>1:
        hl = sorted(hl,key = lambda x:x.data)
        hf = BTree(hl[0].data + hl[1].data,Index)
        Index += 1
        hf.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,v1
        values = v1.get()
        values = values.split()
        for x in range(len(values)):
            if not values[x].isnumeric():
                v1.set("输入错误:包含非数字字符")
                break
        return
    
    tk.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')






仅可输入数字:

 

确认后退出:

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值