如何实现以标准树形格式打印二叉树/二叉搜索树?
实现二叉树/二叉搜索树的标准树形打印
当然可以实现这种对称的标准树形打印效果,核心是通过计算树的层级间距和节点位置,用空格对齐每一层节点,同时生成对应的连接线。下面给出具体实现思路和代码:
实现思路
- 先计算树的最大深度,确定需要打印的总层数
- 根据层数计算每层节点的起始位置和节点间间隔,根节点初始处于最中间位置
- 分层处理:先按计算好的位置打印当前层所有节点,再根据当前层节点位置生成下一层的连接线
- 用队列迭代处理每一层节点,同时记录每个节点的打印位置,方便生成对应连接线
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
相关产品推荐
相关产品推荐

