leetcode 655. 输出二叉树

在一个 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] 中。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/print-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

1:先遍历一次树,获取其最大深度d。
2:所以可以创建一个二维数组arr来记录来记录各个节点。根据树的性质,二维数组的参数为arr[d][(2 << (d - 1)) - 1]用 arr[m][n]。
3:再次遍历树,其根节点的横坐标为n 的中点。
4:之后,前序遍历,子节点和父节点的横坐标的距离为m == 1 ? 1 : (2 << (m - 2))。
5:最后,二维数组转换为list。
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<List<String>> printTree(TreeNode root) {
        int d = findD(root);
        int length = (2 << (d - 1)) - 1;
        List<List<String>> all = new ArrayList<>(d);
        String[][] arr = new String[d][length];
        find(root, arr, d - 1, (d == 1 ? 1 : 2 << (d - 2)) - 1);
        for (int i = 0; i < d; i++) {
            List<String> list = new ArrayList<>(length);
            all.add(list);
            String[] strs = arr[d - i - 1];
            for (int j = 0; j < length; j++) {
                list.add(strs[j] == null ? "" : strs[j]);
            }
        }
        return all;
    }

    private void find(TreeNode node, String[][] arr, int m, int n) {
        if (node == null) {
            return;
        }
        arr[m][n] = String.valueOf(node.val);
        int item  = m == 1 ? 1 :(2 << (m - 2));
        find(node.left, arr, m - 1, n - item);
        find(node.right, arr, m - 1, n + item);
    }

    private int findD(TreeNode node) {
        if (node == null) {
            return 0;
        }
        return Math.max(findD(node.left), findD(node.right)) + 1;
    }
}

 
posted @ 2021-07-27 17:28  旺仔古李  阅读(36)  评论(0编辑  收藏  举报