# 如何用python画完美二叉树

• 写回答

#### 4条回答默认 最新

• 爱音斯坦牛 全栈领域优质创作者 2022-09-23 10:41
关注

这只能代码写二叉树呀，你要画个图，只能用海龟画笔呀，要实在想结合二叉树数代码和海龟画笔或者matplotlib搞这样的一个，看看这两个博客试试：
https://blog.csdn.net/jluzhanghm1720/article/details/121522902

http://t.csdn.cn/RDgfX
如果你要打印出二叉树，可以实现下图：

这样的可以

``````# coding=utf-8
class Node(object):
def __init__(self, data):
self.data = data
self.parent = None
self.left_child = None
self.right_child = None

class TreeQueue(object):
def __init__(self):
self.__members = list()

def is_empty(self):
return not len(self.__members)

def enter(self, data):
self.__members.insert(0, data)

def outer(self):
if self.is_empty():
return
return self.__members.pop()

class PerfectBinaryTree(object):

def __init__(self):
self.__root = None
self.prefix_branch = '├'
self.prefix_trunk = '|'
self.prefix_leaf = '└'
self.prefix_empty = ''
self.prefix_left = '─L─'
self.prefix_right = '─R─'

def is_empty(self):
return not self.__root

def append(self, data):
node = Node(data)
if self.is_empty():
self.__root = node
return
queue = TreeQueue()
queue.enter(self.__root)
while not queue.is_empty():
cur = queue.outer()
if cur.left_child is None:
cur.left_child = node
node.parent = cur
return
queue.enter(cur.left_child)
if cur.right_child is None:
cur.right_child = node
node.parent = cur
return
queue.enter(cur.right_child)

def show(self):
if self.is_empty():
print('空二叉树')
return
queue = TreeQueue()
queue.enter(self.__root)
while not queue.is_empty():
cur = queue.outer()
print(cur.data, end=' ')
if cur.left_child is not None:
queue.enter(cur.left_child)
if cur.right_child is not None:
queue.enter(cur.right_child)
print()

def is_exist(self, data):
if self.is_empty():
return False
queue = TreeQueue()
queue.enter(self.__root)
while not queue.is_empty():
cur = queue.outer()
if cur.data == data:
return True
if cur.left_child is not None:
queue.enter(cur.left_child)
if cur.right_child is not None:
queue.enter(cur.right_child)
return False

def show_tree(self):
if self.is_empty():
print('空二叉树')
return
print(self.__root.data)
self.__print_tree(self.__root)

def __print_tree(self, node, prefix=None):
if prefix is None:
prefix = ''
prefix_left_child = ''
else:
prefix = prefix.replace(self.prefix_branch, self.prefix_trunk)
prefix = prefix.replace(self.prefix_leaf, self.prefix_empty)
prefix_left_child = prefix.replace(self.prefix_leaf, self.prefix_empty)
if self.has_child(node):
if node.right_child is not None:
print(prefix + self.prefix_branch + self.prefix_right + str(node.right_child.data))
if self.has_child(node.right_child):
self.__print_tree(node.right_child, prefix + self.prefix_branch + ' ')
else:
print(prefix + self.prefix_branch + self.prefix_right)
if node.left_child is not None:
print(prefix + self.prefix_leaf + self.prefix_left + str(node.left_child.data))
if self.has_child(node.left_child):
prefix_left_child += '  '
self.__print_tree(node.left_child, self.prefix_leaf + prefix_left_child)
else:
print(prefix + self.prefix_leaf + self.prefix_left)

def has_child(self, node):
return node.left_child is not None or node.right_child is not None

if __name__ == '__main__':
tree = PerfectBinaryTree()
print(tree)
print("is_empty: ", tree.is_empty())

tree.show()
for i in range(15):
tree.append(i)
tree.show()

print(tree.is_exist(2))
print(tree.is_exist(200))

tree.show_tree()
``````
本回答被题主选为最佳回答 , 对您是否有帮助呢?
评论 编辑记录

• 系统已结题 10月1日
• 已采纳回答 9月23日
• 修改了问题 9月23日
• 创建了问题 9月23日

#### 悬赏问题

• ¥20 ERR_CACHE_MISS 确认重新提交表单
• ¥20 关于vba使用HTMLfile执行js函数问题
• ¥60 悬赏求解，通过实时现场摄像头的视频图像识别其他对家打出的麻将牌，识别麻将牌，识别牌墙位置，通过识别对家打出了什么牌
• ¥15 关于#GPU jetson#的pcie驱动开发问题，如何解决？
• ¥15 stm32f103zet6 串口5无法收发数据
• ¥15 关于C语言使用线程队列实现多线程并发
• ¥15 这个运行，错误在哪里呀，大家看看吧，教导我