哈夫曼树可视化显示 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')






哈夫曼树可视化显示 Python_第1张图片

仅可输入数字:

哈夫曼树可视化显示 Python_第2张图片

哈夫曼树可视化显示 Python_第3张图片

哈夫曼树可视化显示 Python_第4张图片

 

确认后退出:

哈夫曼树可视化显示 Python_第5张图片

你可能感兴趣的:(二叉树,可视化显示,哈夫曼树,二叉树,哈夫曼树,可视化显示)