剑指Offer60:把二叉树打印成多行(Java)

思路分析

方法一:
沿用上一题“按之字形顺序打印二叉树”的思路,用两个队列实现分层,当一个队列空了意味着这一层遍历完了。
方法二:
用一个队列,二叉树的分层用每一层个数的来划分

题目描述

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

方法一代码:

import java.util.ArrayList;
import java.util.Queue;
import java.util.LinkedList;
public class Solution {
    ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
    ArrayList<ArrayList<Integer> > res=new ArrayList<>();
    Queue<TreeNode> que1=new LinkedList<>();
    Queue<TreeNode> que2=new LinkedList<>();
    que1.offer(pRoot);//Stack,Queue都能用isEmpty()判空
        while(!que1.isEmpty()||!que2.isEmpty()){
            ArrayList<Integer> tmp1=new ArrayList<Integer>();
            ArrayList<Integer> tmp2=new ArrayList<Integer>();
            while(!que1.isEmpty()){//队列为空,即遍历了一层结点
                TreeNode node=que1.poll();
                if(node!=null){
                    tmp1.add(node.val);
                    que2.offer(node.left);
                    que2.offer(node.right);
                }
            }
            if(!tmp1.isEmpty()){
                 res.add(tmp1);
            }
            while(!que2.isEmpty()){
                TreeNode node=que2.poll();
                if(node!=null){
                    tmp2.add(node.val);
                    que1.offer(node.left);
                    que1.offer(node.right);
                }
            }
            if(!tmp2.isEmpty()){
               res.add(tmp2);
            }
        }
        return res;
    }
}

方法二代码:

import java.util.ArrayList;
import java.util.Queue;
import java.util.LinkedList;
public class Solution {
    ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer> > res =new ArrayList<ArrayList<Integer> >();
        if(pRoot==null){
            return res;
        }
        int index=0;
        int length=1;
        Queue<TreeNode> que=new LinkedList<>();
        que.offer(pRoot);
        ArrayList<Integer> tmp=new ArrayList<Integer>();
        while(!que.isEmpty()){
            TreeNode node=que.poll();
            tmp.add(node.val);
            index++;
            if(node.left!=null){
                que.offer(node.left);
            }
            if(node.right!=null){
                que.offer(node.right);
            }
            if(index==length){//意味着遍历完了一层二叉树,像遍历数组一样,index指向从0走到了length-1。
                res.add(tmp);
                index=0;
                length=que.size();
                tmp=new ArrayList<Integer>();//每一层新建一个ArrayList<Integer>,保存每一层的数值。
            }
        }
        return res;
    }
}
posted @ 2020-02-18 20:40  31楼下小黑  阅读(132)  评论(0编辑  收藏  举报