直接在队列中添加分层信息
把二叉树打印成多行
http://www.nowcoder.com/questionTerminal/445c44d982d04483b04a54f298796288
在队列中使用null节点标志一行的结束。
每次从队列中取出一个元素:
- 若是null:说明此行出队已经结束,同时下一行节点的入队也已经结束,那么就再在队列尾部添加null标志。
- 若不是null:继续遍历当前行的元素。
例子:
1
/ \
2 3
/ \ / \
4 5 6 7
队列初始状态: [null][1]=>
1出队,2,3入队: [3][2][null]=>
null出队,一行结束,向队尾添加null标志: [null][3][2]=>
2出队,4,5入队: [5][4][null][3]=>
3出队,6,7入队: [7][6][5][4][null]=>
null出队,一行结束,向队尾添加null标志: [null][7][6][5][4]=>
4.5.6.7依次出队: [null]=>
null出队后发现链表为空,说明层次遍历结束,不再向队尾添加null
......代码如下:
import java.util.*;
public class Solution {
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> lists=new ArrayList<>();
if(pRoot==null) return lists;
Queue<TreeNode> queue=new LinkedList<>();
queue.offer(pRoot);
queue.offer(null);//分行符号
ArrayList<Integer> list=new ArrayList<>();//存储一行的结果
while(!queue.isEmpty()){
TreeNode node=queue.poll();
if(node==null){
if(!queue.isEmpty()) queue.offer(null);//添加换行标志,一定要先判断队列不为空
lists.add(list);//把此行结果加入lists
list=new ArrayList<Integer>();//为新的一行申请空间
}
else{
if(node.left!=null) queue.offer(node.left);
if(node.right!=null) queue.offer(node.right);
list.add(node.val);
}
}
return lists;
}
}时间复杂度O(n)
空间复杂度O(w) w表示树的最大宽度,也就是链表的最大长度