携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第27天,点击查看活动详情
刷题的日常-2022年8月22日
一天一题,保持脑子清爽
输出二叉树
来自leetcode的 655 题,题意如下:
给你一棵二叉树的根节点 root ,请你构造一个下标从 0 开始、大小为 m x n 的字符串矩阵 res ,用以表示树的 格式化布局 。构造此格式化布局矩阵需要遵循以下规则:
- 树的 高度 为 height ,矩阵的行数 m 应该等于 height + 1 。
- 矩阵的列数 n 应该等于 2height+1 - 1 。
- 根节点 需要放置在 顶行 的 正中间 ,对应位置为 res[0][(n-1)/2] 。
- 对于放置在矩阵中的每个节点,设对应位置为 res[r][c] ,将其左子节点放置在 res[r+1][c-2height-r-1] ,右子节点放置在 res[r+1][c+2height-r-1] 。
- 继续这一过程,直到树中的所有节点都妥善放置。
- 任意空单元格都应该包含空字符串 "" 。
返回构造得到的矩阵 res 。
理解题意
我们可以从题意中提取的条件如下:
- 题目给我们一棵树
- 要求我们打印出来
- 限制条件题目也已经给出
- 最终返回需要打印的结果
做题思路
题目已经将所有的限制条件给出来了,我们直接模拟就可以
- 首先需要知道树的高度
- 知道了树的高度之后我们就能计算最大层的数量是多少了,题目把计算公式直接给我们了
- 然后根节点放在最高层的中间
- 之后每一层的节点由题目的限制条件进行摆放,我们可以通过递归模拟整个过程
- 最终返回添加的结果
代码实现
代码实现如下:
public class Solution {
List<List<String>> result;
int maxSize, height, size;
public List<List<String>> printTree(TreeNode root) {
height = -1;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while ((size = queue.size()) > 0) {
height++;
while (size-- > 0) {
TreeNode node = queue.poll();
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
}
}
result = new ArrayList<>(height + 1);
maxSize = (1 << (height + 1)) - 1;
List<String> item = createFloor(maxSize);
item.set((maxSize - 1) / 2, Integer.toString(root.val));
result.add(item);
fillTree(1, (maxSize - 1) / 2, root);
return result;
}
private void fillTree(int r, int idx, TreeNode parent) {
if (height < r) {
return;
}
if (result.size() == r) {
result.add(createFloor(maxSize));
}
int left, right;
List<String> item = result.get(r);
item.set(left = (idx - (1 << (height - r))), parent == null ? "" : parent.left == null ? "" : Integer.toString(parent.left.val));
item.set(right = (idx + (1 << (height - r))), parent == null ? "" : parent.right == null ? "" : Integer.toString(parent.right.val));
fillTree(++r, left, parent == null ? null : parent.left);
fillTree(r, right, parent == null ? null : parent.right);
}
private List<String> createFloor(int maxSize) {
List<String> result = new ArrayList<>(maxSize);
for (int i = 0; i < maxSize; i++) {result.add("");}
return result;
}
}