用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')
仅可输入数字:
确认后退出: