首页 > 其他分享 >横向打印二叉树

横向打印二叉树

时间:2023-08-02 19:00:13浏览次数:39  
标签:node None self 打印 横向 value 二叉树 print per

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)

标签:node,None,self,打印,横向,value,二叉树,print,per
From: https://www.cnblogs.com/mengzhuo/p/17601532.html

相关文章

  • 佳能 打印机 L140/160 驱动下载
    FAX-L140/L160https://www.canon.com.cn/supports/download/sims/list/slist?fileTypeId=23&categoryId=12&seriesId=78&modelId=1192&OSName=Windows10(x64)&channel=1https://www.canon.com.cn/supports/download/simsdetail/0100825701.html?model......
  • 翻转二叉树
    思路:使用层序遍历的方法:将根节点入队,然后将根节点的左节点和右节点交换,每次for循环都执行“如果左节点不为空则将左节点入队,如果右节点不为空就将右节点入队,队头出队,将队头的左右结点交换,然后队头的左右节点不为空,将队头的左右结点入队。1voidceng(Node*node,vector<vector......
  • 对称二叉树
    1boolcompare(Node*left,Node*right){2if(left==NULL&&right!=NULL)returnfalse;3elseif(left!=NULL&&right==NULL)returnfalse;4elseif(left==NULL&&right==NULL)returntrue;5//排除了空节点......
  • 二叉树遍历
    递归实现:前序遍历将根结点输入容器,然后对左子树进行先序遍历,再对右子树进行先序遍历1voidfrontfind(Node*node,vector<int>&vec){2if(node==nullptr){3return;4}5//非终止条件,非递归入口,只需考虑如果只有一个结点需要做什么6......
  • 如何在 Python 中打印对象的属性
    在Python编程语言中,对象是指由类或类型创建的实例。每个对象都有自己的属性,这些属性可以是变量或函数。通常,我们需要打印对象的属性来了解它的状态。本文将介绍如何在Python中打印对象的属性。1.使用dir()函数dir()函数是Python中的一个内置函数,它可以返回一个对象的所有......
  • 剑指 Offer 29. 顺时针打印矩阵(简单)
    题目://不可以用代码随想录里螺旋矩阵的思路classSolution{public:vector<int>spiralOrder(vector<vector<int>>&matrix){vector<int>result;if(matrix.empty())returnresult;intrl=0,rh=matrix.size()-1;......
  • java打印日志时,如何对字段进行脱敏?
    java打印日志时,如何对字段进行脱敏?原文链接:https://blog.csdn.net/weixin_43901749/article/details/129150818第一步,创建类继承MessageConverter,重写convert方法,添加注解@Component("sensitive")第二步,在logback.xml中增加conversionRule标签在我们开发项目的时候,有些......
  • 二叉树的结点个数
    二叉树的节点个数假设二叉树如下图所示:要想知道二叉树的节点个数,我们通常会想到遍历二叉树的同时使用一个变量来记录,假设变量为size,使用前序遍历,每遍历一个结点让size++,可设置程序如下:intTreeSize(BTNode*root){ intsize=0; if(root==NULL) { return0; } size......
  • UVM:3.4.2 重载打印信息的严重性
    1.所有warning替换成error:2.只对某个特定id起作用:3.重载严重性是没有递归函数的。4.可以在命令行中实现:<simcommand>+uvm_set_severity=<comp>,<id>,<currentseverity>,<new_severity><simcommand>+uvm_set_severity="uvm_test_top.env.i_agt.drv,my_driver,......
  • sqlserver SELECT显示和PRINT打印超长的字符
    步骤一:SSMS里返回的列值长度限制,问题没有解决步骤二:使用如下方式”Cast或FORXMLPATH;问题还是一样printCast(@AgentListastext)select@AgentListforxmlPath('')selectCAST(@AgentListasXML)分析问题:一直只显示50字符,最终找到问题所在,是定义的变量长度的问题,@Agen......