python打印一棵二叉树图形

为了便于刷leetcode测试自己写的函数,真实观察经过一些操作后树的变化,

写了以下几个函数:

  • FUN1 由数组创建一棵树
  • FUN2.3 层次遍历一棵树,以数组的形式返回遍历结果(完全二叉树,空结点-1补全), 用于绘制图形
  • FUN3 一棵树的最大深度
  • FUN4 打印一棵二叉树图形
# tree.py

"""二叉树数据结构"""


class TreeNode:
    def __init__(self, val=-1):
        self.val = val
        self.left = None
        self.right = None


"""FUN1 由数组 创建一棵树"""


def tree_create(arr, index: int):
    tnode = None
    if index < len(arr):
        if arr[index] == null:
            return
        tnode = TreeNode(arr[index])
        tnode.left = tree_create(arr, index * 2 + 1)
        tnode.right = tree_create(arr, index * 2 + 2)
    return tnode



"""FUN2.3 层次遍历一棵树,以数组的形式返回遍历结果(与原树高度相同的完全二叉树,空结点-1补全), 用于绘制图形"""


def tree_level_complete_binary_tree(root):
    if root is None:
        return
    depth = tree_depth(root)
    tree_graph = []
    queue = [root]
    while queue:
        node = queue.pop(0)
        tree_graph.append(node.val)
        if node.left:
            queue.append(node.left)
        else:
            queue.append(TreeNode())
        if node.right:
            queue.append(node.right)
        else:
            queue.append(TreeNode())
        tag = True  # 全是null
        for q in queue:
            if q.val != -1:
                tag = False
        if tag:  # 全是null
            break
    for i in range(len(tree_graph), 2 ** depth - 1):
        tree_graph.append(-1)
    return tree_graph


"""FUN3 求一棵树的最大深度"""


def tree_depth(root) -> int:
    if root is None:
        return 0
    else:
        return max(tree_depth(root.left), tree_depth(root.right)) + 1


"""FUN4 打印一棵二叉树图形"""


def tree_print_graph(root):
    depth = tree_depth(root)
    tree_graph = tree_level_complete_binary_tree(root)
    print(tree_graph)
    nodes_val = [[] for i in range(depth)]  # 记录每一层的结点
    graph = ["" for i in range(depth)]
    # 排列好结点的位置
    for i in range(depth):
        nodes_val[i] = tree_graph[2 ** i - 1: 2 ** (i + 1) - 1]
        # print(nodes_val)
        for j in range(len(nodes_val[i])):
            if nodes_val[i][j] == -1:
                nodes_val[i][j] = " "
            graph[i] += str(nodes_val[i][j]) + (" " * (2 ** (depth - i + 1) - 1))  # 添加结点之间的间隔,最底层间隔3个“ ”
            # print(graph[i])
        graph[i] = (" " * ((2 ** (depth - i)) - 2)) + graph[i]  # 错开位置,构成树的形状,
        # print(graph[i])
    # print("###################################################################")
    for s in graph:
        print(s)

 对以上函数测试:

# testTree.py

from tree import *

arr = ['a', 'b', 'c', 'd', null, 'f', 'g', 'h', 'i', null, null, 'l', 'm']
# arr = [0, 1, 2, null, 4, 5, 6, null, null, 9]
# arr = [0, 1, 2, 3, 4, 5, 6]
# arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]
# arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l']

print('\n' + "FUN1 由数组创建一棵树")
root = tree_create(arr, 0)

print('\n' + "FUN2.3 层次遍历一棵树,以数组的形式返回遍历结果(完全二叉树,空结点-1补全), 用于绘制图形")
print(tree_level_complete_binary_tree(root))

print('\n' + "FUN3 一棵树的最大深度")
print("二叉树的最大深度:", tree_depth(root))

print('\n' + "FUN4 打印一棵二叉树图形")
tree_print_graph(root)

运行结果:

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值