麦当没有劳 2022-09-23 09:57 采纳率: 50%
浏览 93
已结题

如何用python画完美二叉树

请问各位怎么用python画完美二叉树 perfect binary tree
要能在python中作出这种图。

img

  • 写回答

4条回答 默认 最新

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

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

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

    img


    这样的可以

    # 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()
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 运筹学中在线排序的时间在线排序的在线LPT算法
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试,帮帮忙吧