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)