题目描述

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

思路

该题和按照之字形打印二叉树差不多,需要每一层输出一行,也就是每一层需要输出一个list,那么需要两个队列进行合作,一个队列出队(保存上一层节点),一个队列入队(保存前一个队列的左右节点,即下一层节点),只不过该题和按照之字形二叉树打印的区别在于,之字形二叉树需要区分奇数层和偶数层,那么就需要两个队列保存左右节点的顺序不一样,上一个队列先保存左节点,再保存右节点;下一个队列先保存右节点,再保存左节点。

代码

import java.util.ArrayList;
import java.util.LinkedList;

public class Print1 {

    public class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;

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

        }

    }

    ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> list = new ArrayList<>();

        if(pRoot == null) return list;

        LinkedList<TreeNode> queue1 = new LinkedList<>();
        LinkedList<TreeNode> queue2 = new LinkedList<>();

        queue1.add(pRoot);

        while (!queue1.isEmpty() || !queue2.isEmpty()){
            if(!queue1.isEmpty()){
                ArrayList<Integer> subList = new ArrayList<>();
                while (!queue1.isEmpty()){

                    TreeNode curNode = queue1.pollFirst();
                    subList.add(curNode.val);

                    if(curNode.left != null){
                        queue2.add(curNode.left);
                    }
                    if(curNode.right != null){
                        queue2.add(curNode.right);
                    }
                }
                list.add(subList);
            }else {
                ArrayList<Integer> subList1 = new ArrayList<>();
                while (!queue2.isEmpty()){
                    TreeNode curNode = queue2.pollFirst();
                    subList1.add(curNode.val);

                    if(curNode.left != null){
                        queue1.add(curNode.left);
                    }
                    if(curNode.right != null){
                        queue1.add(curNode.right);
                    }
                }
                list.add(subList1);
            }

        }


        return list;
    }
}

flyingcr
44 声望4 粉丝

引用和评论

0 条评论