Given the root
of a binary tree, construct a 0-indexed m x n
string matrix res
that represents a formatted layout of the tree. The formatted layout matrix should be constructed using the following rules:
- The height of the tree is
height
and the number of rowsm
should be equal toheight + 1
. - The number of columns
n
should be equal to2height+1 - 1
. - Place the root node in the middle of the top row (more formally, at location
res[0][(n-1)/2]
). - For each node that has been placed in the matrix at position
res[r][c]
, place its left child atres[r+1][c-2height-r-1]
and its right child atres[r+1][c+2height-r-1]
. - Continue this process until all the nodes in the tree have been placed.
- Any empty cells should contain the empty string
""
.
Return the constructed matrix res
.
Example 1:
Input: root = [1,2] Output: [["","1",""], ["2","",""]]
Example 2:
Input: root = [1,2,3,null,4] Output: [["","","","1","","",""], ["","2","","","","3",""], ["","","4","","","",""]]
Constraints:
- The number of nodes in the tree is in the range
[1, 210]
. -99 <= Node.val <= 99
- The depth of the tree will be in the range
[1, 10]
.
思路:按照题目意思,先求出hight,然后width就是2^height - 1.然后 root.val就设置在每个区间的中间,因为矩阵是个包含了左边和右边的全部index的矩阵,所以root.val就是mid的val;
/**
* 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) {
List<List<String>> lists = new ArrayList<List<String>>();
int height = getHeight(root);
int width = (int) Math.pow(2, height) - 1;
for(int i = 0; i < height; i++) {
List<String> list = new ArrayList<>();
for(int j = 0; j < width; j++) {
list.add("");
}
lists.add(list);
}
buildTree(lists, root, 0, 0, width - 1);
return lists;
}
private void buildTree(List<List<String>> lists, TreeNode root, int row, int start, int end) {
if(root == null) {
return;
}
int mid = start + (end - start) / 2;
lists.get(row).set(mid, String.valueOf(root.val));
buildTree(lists, root.left, row + 1, start, mid - 1);
buildTree(lists, root.right, row + 1, mid + 1, end);
}
private int getHeight(TreeNode root) {
if(root == null) {
return 0;
}
return 1 + Math.max(getHeight(root.left), getHeight(root.right));
}
}