横向打印二叉树

发布时间 2023-08-02 18:59:33作者: 完美二叉树

https://www.luogu.com.cn/problem/P8603

构造树的过程不难,比较烦人的是如何把这棵树横着打印出来

...|-12
10-|
...|-8-|
.......|...|-7
.......|-5-|
...........|-4

首先可以发现,打印的顺序是中序遍历,打印的过程可以在中序遍历的基础上修改

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


class Tree:
    def __init__(self, arr):
        self.root = TreeNode(None)
        for num in arr:
            self.insert(num)
        self.middle_order()

    def insert(self, value):
        cur_node = self.root
        while cur_node.value is not None:
            cur_node = cur_node.left if value < cur_node.value else cur_node.right
        cur_node.value = value
        cur_node.left = TreeNode(None)
        cur_node.right = TreeNode(None)

    def middle_order(self, node=None, per_print='', location=''):
        """

        :param node:
        :param per_print:
        :param location: a string represent location of the node, '0' represent left and '1' represent right
        :return:
        """
        new_per_print = list(per_print)
        indexes = [i for i, c in enumerate(new_per_print) if c == '|']  # all indexes of '|'
        for i in range(len(location) - 1):
            if location[i] == location[i + 1]:
                new_per_print[indexes[i]] = '.'
        new_per_print = ''.join(new_per_print)
        if node is None:
            node = self.root
            to_print = str(node.value) + '-|'
        elif node.left.value is None and node.right.value is None:
            to_print = '-' + str(node.value)
            print(new_per_print + to_print)
            return
        else:
            to_print = '-' + str(node.value) + '-|'
        s_len = len(to_print) - 1
        if node.right.value is not None:
            self.middle_order(node.right, per_print=per_print + '.' * s_len + '|', location=location + '1')
        print(new_per_print + to_print)
        if node.left.value is not None:
            self.middle_order(node.left, per_print=per_print + '.' * s_len + '|', location=location + '0')


nums = [int(_) for _ in input().split()]
t = Tree(nums)