问题
思路
- 行数 m 是树的高度,所以要先计算出树的高度
- 列数 n 从另一个角度想,既然能够在任意两个几点位置不重复的情况下容纳下所有的节点,证明列数n的数量为以m为高度的满二叉树的所有节点的数量
- 把
List<List<String>>
中所有的的元素都存为“”
,然后使用深度优先搜索算法和分治法,更改里面的元素 (具体位置为首末位置的中间节点),同时设置一个deep变量,用来存储当前树的深度
时间
代码
class Solution {
public List<List<String>> printTree(TreeNode root) {
int deep=helper(root);//总共有多少list
int len=(int)(Math.pow(2,deep))-1;//list里的长度
List<List<String>> res=new ArrayList<>();
if(root==null)return res;
for(int i=0;i<deep;i++){
List<String> list=new ArrayList<>();
for(int j=0;j<len;j++){
list.add("");
}
res.add(list);
}
helper2(root,res,0,len,0);
return res;
}
//计算最大深度
public int helper(TreeNode root){
return root!=null?Math.max(helper(root.left),helper(root.right))+1:0;
}
public void helper2(TreeNode root,List<List<String>> res,int start,int end,int deep){
if(root!=null){
int mid=(start+end)/2;
res.get(deep).set(mid,String.valueOf(root.val));
helper2(root.left,res,start,mid-1,deep+1);
helper2(root.right,res,mid+1,end,deep+1);
}
}
}