把二叉树打印成多行

血红的双手。 提交于 2020-01-24 06:58:26

从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

思路同上题 之字形打印二叉树一样
利用队列(先进先出) 储存如Array list 再存入总arraylist

public class Solution {
    ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        
        ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
        
        if(pRoot == null){
            return res;
        }
        
        ArrayList<Integer> temp = new ArrayList<Integer>();//
        Queue <TreeNode> q = new LinkedList<TreeNode>();//创建队列用来添加节点
        q.offer(pRoot);//添加根节点
        
        int start = 0, end = 1;
        while(!q.isEmpty()){ //如果队列不为空, 继续循环 直到为空
            TreeNode node = q.poll();   //添加queue第一个排出的元素,并删除
            temp.add(node.val);
            start++;    //记录值+1
            if(node.left != null){  //判断 是否有左子树, 如果有添加到queue
                q.add(node.left);
            }
            if(node.right != null){//判断 是否有右子树, 如果有添加到queue
                q.add(node.right);
            }
            
           if (start == end){ // 如果记录值到达queue的size reset
               start = 0;
               res.add(temp);
               temp = new ArrayList<Integer>();// 并且将当前行存入Arraylist
               end = q.size();
           }
            
        }
        return res;
    }
    
}

相关知识
queue的用法
offer,add 区别:

一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。

这时新的 offer 方法就可以起作用了。它不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由 offer() 返回的 false。

poll,remove 区别:

remove() 和 poll() 方法都是从队列中删除第一个元素。remove() 的行为与 Collection 接口的版本相似, 但是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适合容易出现异常条件的情况。

peek,element区别:

element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!