655.输出二叉树
【LetMeFly】655.输出二叉树
力扣题目链接:https://leetcode.cn/problems/print-binary-tree/
在一个 m*n 的二维字符串数组中输出二叉树,并遵守以下规则:
- 行数
m
应当等于给定二叉树的高度。 - 列数
n
应当总是奇数。 - 根节点的值(以字符串格式给出)应当放在可放置的第一行正中间。根节点所在的行与列会将剩余空间划分为两部分(左下部分和右下部分)。你应该将左子树输出在左下部分,右子树输出在右下部分。左下和右下部分应当有相同的大小。即使一个子树为空而另一个非空,你不需要为空的子树输出任何东西,但仍需要为另一个子树留出足够的空间。然而,如果两个子树都为空则不需要为它们留出任何空间。
- 每个未使用的空间应包含一个空的字符串
""
。 - 使用相同的规则输出子树。
示例 1:
输入: 1 / 2 输出: [["", "1", ""], ["2", "", ""]]
示例 2:
输入: 1 / \ 2 3 \ 4 输出: [["", "", "", "1", "", "", ""], ["", "2", "", "", "", "3", ""], ["", "", "4", "", "", "", ""]]
示例 3:
输入: 1 / \ 2 5 / 3 / 4 输出: [["", "", "", "", "", "", "", "1", "", "", "", "", "", "", ""] ["", "", "", "2", "", "", "", "", "", "", "", "5", "", "", ""] ["", "3", "", "", "", "", "", "", "", "", "", "", "", "", ""] ["4", "", "", "", "", "", "", "", "", "", "", "", "", "", ""]]
注意: 二叉树的高度在范围 [1, 10] 中。
方法一:DFS统计高度 + BFS填充矩阵
其实我觉得这道题的配图不是很好,样例二应该是这样的:
1 |
|
也就是说,越靠近根部,二叉树的“开口”就越大,4
不在1
的正下方。
但是这些都无所谓,只需要按照题意进行赋值就好了。
首先统计二叉树的高度。
1 |
|
注意,题目中二叉树的根节点是0
层,因此这个函数统计出来的$height$其实是题目中的$height + 1$
因此,矩阵的大小为$height\times 2^{height} - 1$
1 |
|
之后我们可以建立一个结构体
1 |
|
再建立一个队列,将根节点及其在矩阵中的位置入队。
在队列不空时,不断取出元素并在矩阵对应的位置赋值,如果左子或右子不为空,就入队。
左右子的位置计算公式题目中也已给出。
- 时间复杂度$O(h\times 2^h)$,其中$h$是二叉的高度
- 空间复杂度$O(C)$,其中$C$是二叉树单层的最大节点数量
AC代码
C++
1 |
|
同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/126461060
655.输出二叉树
https://blog.letmefly.xyz/2022/08/22/LeetCode 0655.输出二叉树/