從上到下按層打印二叉樹,同一層結點從左至右輸出。每一層輸出一行。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; } }