def my_print(*args):
print('\n')
print(*args)
def get_tree_lines(node, gap=2):
"""返回树的字符图,每个节点与子树之间留 gap 个空格"""
if node is None:
return [], 0, 0, 0
label = str(node.val)
label_width = len(label)
if not node.left and not node.right:
return [label], label_width, 1, label_width // 2
# 左右子树
left_lines, lw, lh, lm = get_tree_lines(node.left, gap)
right_lines, rw, rh, rm = get_tree_lines(node.right, gap)
# 添加间距
between = gap
width = lw + between + label_width + between + rw
first_line = " " * (lw + between) + label + " " * (rw + between)
# 构造连接线
left_link = " " * lm + "/" + " " * (lw - lm - 1 + between)
right_link = " " * (between + rm) + "\\" + " " * (rw - rm - 1)
second_line = left_link + " " * label_width + right_link
# 填补子树高度差
height = max(lh, rh)
left_lines += [" " * lw] * (height - lh)
right_lines += [" " * rw] * (height - rh)
lines = [first_line, second_line]
for l, r in zip(left_lines, right_lines):
lines.append(l + " " * (between * 2 + label_width) + r)
return lines, width, height + 2, lw + between + label_width // 2
def print_tree(root, gap=2):
lines, *_ = get_tree_lines(root, gap)
for line in lines:
print(line)