在刷leetcode時,有時候需要在本地除錯**,但是苦於本地沒有樹的資料型別,所以自己動手用python寫了乙個二叉樹類,並且實現了視覺化。
下面的程式僅僅是為了建立二叉樹,方便在刷leetcode有關題目時進行本地除錯**,所以有些功能沒有加上去,比如刪除節點的功能。程式雖然是二叉樹類,也容易擴充套件到多叉樹。
目前程式只能實現無重複節點的二叉樹構建。
我看到網上有不少的用python實現二叉樹的**,但是它們構建出來的幾乎都是特定型別的二叉樹,比如二叉搜尋樹、完全二叉樹等。本文的程式可以建立任意型別的二叉樹。
程式:
import collections程式執行結果:import networkx as nx
import matplotlib.pyplot as plt
class node:
def __init__(self, val):
self.val = val
self.left = none
self.right = none
class tree:
def __init__(self, root_val):
root_node = node(root_val)
self.root = root_node
def add(self, val, parent_val, position):
parent = self.find(parent_val) # find the parent node. we assume that there is no duplicate nodes.
node = node(val)
if position == 0:
parent.left = node
if position == 1:
parent.right = node
def find(self, value):
que = collections.deque([self.root])
while que:
node = que.popleft()
if node.val == value:
return node
if node.left:
if node.right:
raise keyerror('value not found')
# draw the tree.
def draw(self):
graph = nx.digraph()
graph, pos = self.create_graph(graph, self.root)
fig, ax = plt.subplots(figsize=(8, 10)) # 比例可以根據樹的深度適當調節
nx.draw_networkx(graph, pos, ax=ax, node_size=300)
plt.show()
def create_graph(self, g, node, pos={}, x=0, y=0, layer=1):
pos[node.val] = (x, y)
if node.left:
g.add_edge(node.val, node.left.val)
l_x, l_y = x - 1 / 2 ** layer, y - 1
l_layer = layer + 1
self.create_graph(g, node.left, x=l_x, y=l_y, pos=pos, layer=l_layer)
if node.right:
g.add_edge(node.val, node.right.val)
r_x, r_y = x + 1 / 2 ** layer, y - 1
r_layer = layer + 1
self.create_graph(g, node.right, x=r_x, y=r_y, pos=pos, layer=r_layer)
return (g, pos)
# 示例:
tree = tree(6)
tree.add(val=2, parent_val=6, position=0) # position: 0 means 'left', 1 means 'right'
tree.add(3, 6, 1)
tree.add(13, 2, 0)
tree.add(4, 2, 1)
tree.add(12, 4, 0)
tree.add(0, 4, 1)
tree.add(24, 3, 0)
tree.add(17, 3, 1)
tree.draw()
二叉樹視覺化 Graphviz
大家平時寫c程式有沒有種把記憶體裡的資料結構全給畫出來的衝動呢?資料量小的話,畫起來還蠻簡單,用viso,我前面的文章都用viso畫的。之前寫紅黑樹 的時候,用的是命令列把整個樹列印出來,不過只是一些小片段,很醜,還得自己手動再在紙上畫一遍,非常麻煩,要是用程式就能把圖畫出來那就爽了。好了,推薦使用...
完全二叉樹視覺化
最近在看一些資料結構和演算法,對二叉樹接觸比較多,寫程式時要想知道樹的狀態只能通過監視視窗翻著看,比較費事而且不清晰,因此想寫個將二叉樹視覺化的程式,不過筆者水平有限,暫時只實現了針對完全二叉樹的,如果不是完全二叉樹則可以用0或其他特徵字元代替前部預設的字元,以下分享給大家取用。貼 之前先放個原理圖...
二叉樹視覺化建立(二叉樹正輸出)
1.上面簡單的介紹了二叉樹的線性儲存.2.分析二叉樹的橫向列印.由於在終端上如果不呼叫系統座標函式,而只呼叫printf 來輸出,只能是從上到下從左到右進行,根據這一特點我們只需要 知道每個節點所在的x座標 即前面空了x 1個空格 再加上層次列印就非常容易列印二叉樹了,如根節點可以計算的其座標為 1...