前言
和昨天的方法类似,都是采用二分思想,左侧填充,右侧填充
题目
源码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<String>> printTree(TreeNode root) {
// 得到树的深度
int m = getHeight(root);
// 1<<m-1树的的最大宽度
String [][]ans=new String[m][(1<<m)-1];
List<List<String>> res=new ArrayList<>();
for(String []arr:ans){
// 初始化
Arrays.fill(arr,"");
}
out(ans,root,0,0,ans[0].length);
for(String[] arr:ans){
// 每行赋值
res.add(Arrays.asList(arr));
}
return res;
}
public int getHeight(TreeNode node){
if(node==null){
return 0;
}
// 得到树的高度
return 1 + Math.max(getHeight(node.left),getHeight(node.right));
}
public void out(String[][]ans,TreeNode node,int i,int l,int r){
if(node==null){
return;
}
// 将根节点赋值给最中间
ans[i][(l+r)/2]=""+node.val;
// 左侧递归
out(ans,node.left,i+1,l,(l+r)/2);
// 右侧递归
out(ans,node.right,i+1,(l+r)/2+1,r);
}
}