LeetCode 0655. 输出二叉树
Posted Tisfy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 0655. 输出二叉树相关的知识,希望对你有一定的参考价值。
【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
+----------+-----------+
2 3
+---+
4
也就是说,越靠近根部,二叉树的“开口”就越大,4
不在1
的正下方。
但是这些都无所谓,只需要按照题意进行赋值就好了。
首先统计二叉树的高度。
int getTreeHeight(TreeNode* root)
if (!root)
return 0;
return 1 + max(getTreeHeight(root->left), getTreeHeight(root->right));
注意,题目中二叉树的根节点是0
层,因此这个函数统计出来的
h
e
i
g
h
t
height
height其实是题目中的
h
e
i
g
h
t
+
1
height + 1
height+1
因此,矩阵的大小为 h e i g h t × 2 h e i g h t − 1 height\\times 2^height - 1 height×2height−1
vector<vector<string>> ans(height, vector<string>((1 << height) - 1));
之后我们可以建立一个结构体
struct Node
TreeNode* treeNode; // 当前节点
int x, y; // 当前节点在矩阵中的位置
Node(TreeNode* treeNode, int x, int y) : treeNode(treeNode), x(x), y(y)
;
再建立一个队列,将根节点及其在矩阵中的位置入队。
在队列不空时,不断取出元素并在矩阵对应的位置赋值,如果左子或右子不为空,就入队。
左右子的位置计算公式题目中也已给出。
- 时间复杂度 O ( h × 2 h ) O(h\\times 2^h) O(h×2h),其中 h h h是二叉的高度
- 空间复杂度 O ( C ) O(C) O(C),其中 C C C是二叉树单层的最大节点数量
AC代码
C++
struct Node
TreeNode* treeNode;
int x, y;
Node(TreeNode* treeNode, int x, int y) : treeNode(treeNode), x(x), y(y)
;
class Solution
private:
int getTreeHeight(TreeNode* root)
if (!root)
return 0;
return 1 + max(getTreeHeight(root->left), getTreeHeight(root->right));
public:
vector<vector<string>> printTree(TreeNode* root)
int height = getTreeHeight(root); // 这里的height就是题目中的height + 1
vector<vector<string>> ans(height, vector<string>((1 << height) - 1));
queue<Node> q;
q.push(root, 0, ((1 << height) - 1) / 2);
while (q.size())
auto[node, x, y] = q.front();
q.pop();
ans[x][y] = to_string(node->val);
if (node->left)
q.push(node->left, x + 1, y - (1 << (height - x - 2)));
if (node->right)
q.push(node->right, x + 1, y + (1 << (height - x - 2)));
return ans;
;
同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/126461060
以上是关于LeetCode 0655. 输出二叉树的主要内容,如果未能解决你的问题,请参考以下文章