麦当没有劳 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 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)