刷题的日常-输出二叉树

67 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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;
    }

}

image.png