把二叉樹打印成多行

題目描述

從上到下按層打印二叉樹,同一層結點從左至右輸出。每一層輸出一行。java

思路

該題和按照之字形打印二叉樹差很少,須要每一層輸出一行,也就是每一層須要輸出一個list,那麼須要兩個隊列進行合做,一個隊列出隊(保存上一層節點),一個隊列入隊(保存前一個隊列的左右節點,即下一層節點),只不過該題和按照之字形二叉樹打印的區別在於,之字形二叉樹須要區分奇數層和偶數層,那麼就須要兩個隊列保存左右節點的順序不同,上一個隊列先保存左節點,再保存右節點;下一個隊列先保存右節點,再保存左節點。this

代碼

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;
    }
}
相關文章
相關標籤/搜索