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; } }