剑指offer——把二叉树打印成多行

剑指offer——把二叉树打印成多行

1、题目描述

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

2、我的解法

参照上一个题(按之字形打印二叉树),此处利用两个队列,进行一行一行的打印。
源码如下:

import java.util.ArrayList;
import java.util.Queue;
import java.util.LinkedList;
/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer> > arrays=new ArrayList<ArrayList<Integer> >();
        if(pRoot==null){
            return arrays;
        }
        Queue<TreeNode> queue1=new LinkedList<TreeNode>();
        Queue<TreeNode> queue2=new LinkedList<TreeNode>();
        queue1.offer(pRoot);
        while(!queue1.isEmpty() || !queue2.isEmpty()){
            if(!queue1.isEmpty()){
                ArrayList<Integer> array1=new ArrayList<Integer>();
                while(!queue1.isEmpty()){
                    if(queue1.peek().left!=null){
                        queue2.offer(queue1.peek().left);
                    }
                    if(queue1.peek().right!=null){
                        queue2.offer(queue1.peek().right);
                    }
                    array1.add(queue1.poll().val);
                }
                arrays.add(array1);
            }
            if(!queue2.isEmpty()){
                ArrayList<Integer> array2=new ArrayList<Integer>();
                while(!queue2.isEmpty()){
                    if(queue2.peek().left!=null){
                        queue1.offer(queue2.peek().left);
                    }
                    if(queue2.peek().right!=null){
                        queue1.offer(queue2.peek().right);
                    }
                    array2.add(queue2.poll().val);
                }
                arrays.add(array2);
            }
        }
        return arrays;
    }

}

3、别的解法

利用一个整型记录每一层的节点个数,利用队列进行进队出队。
源码及具体解释如下:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
/*
* 队列LinkedList完成层序遍历,用end记录每层结点数目
*/
public class Solution {
    ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer> > result=new ArrayList<ArrayList<Integer> >();
        if(pRoot==null){
            return result;
        }
        ArrayList<Integer> array=new ArrayList<Integer>();
        Queue<TreeNode> queue=new LinkedList<TreeNode>();
        queue.offer(pRoot);
        int start=0,end=1;//end是每一层的节点个数
        while(!queue.isEmpty()){
            TreeNode current=queue.poll();
            array.add(current.val);
            start++;
            if(current.left!=null){
                queue.offer(current.left);
            }
            if(current.right!=null){
                queue.offer(current.right);
            }
            if(start==end){//start追上end,则证明到每一层的最后一个节点了,需要分行
                start=0;
                end=queue.size();
                result.add(array);
                array=new ArrayList<Integer>();//相当于把array清零置空
            }
        }
        return result;
    }
}

猜你喜欢

转载自blog.csdn.net/yangxingpa/article/details/80788812