二叉树python实现和可视化
在刷LeetCode时,有时候需要在本地调试代码,但是苦于本地没有树的数据类型,所以自己动手用python写了一个二叉树类,并且实现了可视化。
下面的程序仅仅是为了创建二叉树,方便在刷LeetCode有关题目时进行本地调试代码,所以有些功能没有加上去,比如删除节点的功能。程序虽然是二叉树类,也容易扩展到多叉树。
目前程序只能实现无重复节点的二叉树构建。
我看到网上有不少的用python实现二叉树的代码,但是它们构建出来的几乎都是特定类型的二叉树,比如二叉搜索树、完全二叉树等。本文的程序可以创建任意类型的二叉树。
程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | 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: que.append(node.left) if node.right: que.append(node.right) raise KeyError( 'value not found' ) # draw the tree. https://zhuanlan.zhihu.com/p/35574577 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() |
程序运行结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2020-02-28 LeNet, AlexNet, VGG-16, GoogLeNet, ResNet的网络结构及代码