题目:
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
思路:
与剑指offer第22题类似(https://blog.csdn.net/CheDaqian/article/details/89575456)
不同之处在于第22题要求依次输出结点,而本题要求每一层输出一行。
引用了start和end分别来记录本层的第几个结点、表示在一层中有几个结点。
当start=end时,添加本层的所有结点至链表中,并将arr初始化,用来记录下一次的结点。
程序:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
class TreeNode{
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public class subject60 {
public static ArrayList<ArrayList<Integer>> Print(TreeNode pRoot){
ArrayList<ArrayList<Integer>> arrList = new ArrayList<ArrayList<Integer>>();
if(pRoot == null) {
return arrList;
}
ArrayList<Integer> arr = new ArrayList<Integer>();
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(pRoot);//先将根节点入队列
int start = 0;
int end = 1;//第一层的结点数
while(! queue.isEmpty()) {//一直将队列中所有元素都出队为止
TreeNode node = queue.poll();//出栈操作
arr.add(node.val);
start ++;
//节点的左右子树入队操作
if(node.left != null) {
queue.offer(node.left);
}
if(node.right != null) {
queue.offer(node.right);
}
if(start == end) {
arrList.add(arr);
start = 0;
end = queue.size();//end=下一层的结点数
arr = new ArrayList<Integer>();
}
}
return arrList;
}
public static void main(String args[]) {
TreeNode root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(6);
root.left.left = new TreeNode(4);
root.left.right = new TreeNode(5);
System.out.println(Print(root));
}
}