直接在队列中添加分层信息

把二叉树打印成多行

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表示树的最大宽度,也就是链表的最大长度

全部评论

相关推荐

把球:这个听过,你加了就会发现是字节的hr
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务