在一个 m*n 的二维字符串数组中输出二叉树,并遵守以下规则:
行数 m 应当等于给定二叉树的高度。
列数 n 应当总是奇数。
根节点的值(以字符串格式给出)应当放在可放置的第一行正中间。根节点所在的行与列会将剩余空间划分为两部分(左下部分和右下部分)。你应该将左子树输出在左下部分,右子树输出在右下部分。左下和右下部分应当有相同的大小。即使一个子树为空而另一个非空,你不需要为空的子树输出任何东西,但仍需要为另一个子树留出足够的空间。然而,如果两个子树都为空则不需要为它们留出任何空间。
每个未使用的空间应包含一个空的字符串""。
使用相同的规则输出子树。
示例 1:
输入:
1
/
2
输出:
[["", "1", ""],
["2", "", ""]]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/print-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
节点在二维数组中的位置由其层数和中序遍历的位置决定
对二叉树中序遍历求出上述两项值即可
class Solution:
def printTree(self, root: TreeNode) -> List[List[str]]:
def get_level(root):
if root is None:
return 0
return max(get_level(root.left), get_level(root.right)) + 1
nodes = []
last_index = -1
max_level = get_level(root)
def mid_deep(root, level):
nonlocal max_level
nonlocal last_index
if level > max_level:
return
if root is None:
if level < max_level:
mid_deep(None, level+1)
last_index += 1
nodes.append(("", level, last_index))
if level < max_level:
mid_deep(None, level+1)
return
mid_deep(root.left, level+1)
last_index += 1
nodes.append((str(root.val), level, last_index))
mid_deep(root.right, level+1)
mid_deep(root, 1)
if len(nodes) <= 0:
return []
res = [[""] * (2**max_level-1) for i in range(max_level)]
for node in nodes:
res[node[1]-1][node[2]] = node[0]
return res