二叉樹python實現和視覺化

2022-09-27 12:30:11 字數 2406 閱讀 1626

在刷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...