描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
例如:
给定的二叉树是{1,2,3,#,#,4,5}
该二叉树多行打印层序遍历的结果是
[
[1],
[2,3],
[4,5]
]
思路一:这个一看就是层序遍历(bfs)
代码如下:
import java.util.*;
public class Solution {
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> list = new ArrayList<>();
if(pRoot==null)
return list;
Queue<TreeNode> queue = new LinkedList<>();
queue.add(pRoot);
while(queue.size()>0)
{
int len=queue.size();
ArrayList<Integer> tempList = new ArrayList<>();
while(len>0)
{
TreeNode node=queue.poll();
if(node.left!=null)
queue.add(node.left);
if(node.right!=null)
queue.add(node.right);
tempList.add(node.val);
len--;
}
list.add(tempList);
}
return list;
}
}
时间O(N) 每个节点遍历, 空间O(N) 队列长度最坏为树的宽度 O(N)
思路二:通常可以使用bfs实现的都可以使用dfs(深度优先)实现
public class Solution {
ArrayList<ArrayList<Integer>> list = new ArrayList<>();
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
dfs(pRoot,0);
return list;
}
private void dfs(TreeNode root,int level)
{
if(root==null)
return;
if(list.size()<=level)
{
list.add(new ArrayList());//当前深度大于等于列表的长度,需要新建一个“二维”列表
}
list.get(level).add(root.val);
dfs(root.left,level+1);
dfs(root.right,level+1);
}
}
时间O(N)每个节点都遍历,最好空间复杂度单边递归栈即树的深度O(logn),最坏树退化链表O(N)
总结:依然是二叉树的遍历方式,层序遍历
掌握bfs和dfs两种解法
最舒服的一道题,两种解法20分钟,无他,唯手熟尔