You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现以标准树形格式打印二叉树/二叉搜索树?

实现二叉树/二叉搜索树的标准树形打印

当然可以实现这种对称的标准树形打印效果,核心是通过计算树的层级间距和节点位置,用空格对齐每一层节点,同时生成对应的连接线。下面给出具体实现思路和代码:

实现思路

  • 先计算树的最大深度,确定需要打印的总层数
  • 根据层数计算每层节点的起始位置和节点间间隔,根节点初始处于最中间位置
  • 分层处理:先按计算好的位置打印当前层所有节点,再根据当前层节点位置生成下一层的连接线
  • 用队列迭代处理每一层节点,同时记录每个节点的打印位置,方便生成对应连接线

Python 实现代码

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

def print_binary_tree(root):
    if not root:
        print("空树")
        return
    
    # 计算树的最大深度
    def get_depth(node):
        if not node:
            return 0
        return 1 + max(get_depth(node.left), get_depth(node.right))
    
    depth = get_depth(root)
    # 定义单个节点宽度,适配示例中的两位数字格式
    node_width = 2
    # 计算整棵树的最大打印宽度
    max_width = (2 ** (depth - 1)) * node_width + (2 ** (depth - 1) - 1) * 2
    
    # 队列存储(节点, 节点起始打印位置, 当前层级)
    from collections import deque
    queue = deque()
    root_pos = max_width // 2
    queue.append((root, root_pos, 1))
    
    while queue:
        level_size = len(queue)
        node_positions = []
        # 初始化当前层打印行
        line = [" "] * max_width
        
        for _ in range(level_size):
            node, pos, level = queue.popleft()
            if node:
                # 格式化节点值为两位数字,补零对齐
                val_str = f"{node.val:02d}"
                # 将节点值填充到对应位置
                start_idx = pos - len(val_str) // 2
                end_idx = start_idx + len(val_str)
                line[start_idx:end_idx] = list(val_str)
                node_positions.append((pos, node.left, node.right))
                # 计算子节点的打印位置
                offset = max_width // (2 ** level)
                queue.append((node.left, pos - offset, level + 1))
                queue.append((node.right, pos + offset, level + 1))
            else:
                # 空节点占位,避免后续位置偏移
                node_positions.append((pos, None, None))
                queue.append((None, 0, level + 1))
                queue.append((None, 0, level + 1))
        
        # 打印当前层节点
        print("".join(line))
        
        # 非最后一层时打印连接线
        if level < depth:
            line = [" "] * max_width
            for pos, left, right in node_positions:
                if left:
                    line[pos - 1] = "/"
                if right:
                    line[pos + 1] = "\\"
            print("".join(line))

# 测试示例:高度为4的树
root = TreeNode(5)
root.left = TreeNode(3)
root.right = TreeNode(6)
root.left.left = TreeNode(3)
root.left.right = TreeNode(4)
root.right.left = TreeNode(9)
root.right.right = TreeNode(12)
root.left.left.left = TreeNode(1)
root.left.left.right = TreeNode(2)
root.left.right.left = TreeNode(6)
root.left.right.right = TreeNode(5)
root.right.left.left = TreeNode(7)
root.right.left.right = TreeNode(8)
root.right.right.left = TreeNode(10)
root.right.right.right = TreeNode(11)

print_binary_tree(root)

补充说明

  • 代码中通过f"{node.val:02d}"格式化节点值,确保每个节点占2位宽度,和你给出的高度为4的树示例格式一致
  • 如果节点值长度不同,可以调整node_width和格式化字符串,保证对齐效果
  • 空树会直接打印提示,非完全二叉树的空节点位置也会预留,保证树形对称

内容的提问来源于stack exchange,提问作者Amaan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 06:50:26