题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
代码
import java.util.ArrayList;
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<Integer> arr = new ArrayList<Integer>() ;
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
if(pRoot==null) return res;
TreeNode root = pRoot;
// 使用队列 用于存储遍历的节点
LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
// 队列中首先加入根节点
queue.add(root);
// nodeNum: 表示队列中当前层还剩多少个节点
// next: 表示下一层的节点
int nodeNum=1;int next=0;
while(!queue.isEmpty()){
TreeNode temp = queue.remove();
nodeNum--;
//加入当前节点的值
arr.add(temp.val);
// 如果当前节点的左节点不为空,则加入队列
// 并且 下一层节点计数 +1
if(temp.left!=null) {
queue.add(temp.left);
next++;
}
// 如果当前节点的右节点不为空,则加入队列
// 并且 下一层节点计数 +1
if(temp.right!=null) {
queue.add(temp.right);
next++;
}
// 如果当前层的队列已为0,则将当前类的列表加入结果大列表
// 当前列表清零
// 将 下一层节点的个数, 赋值给当前层的个数。
// 此时再将下一层的节点计数, 置为零
if(nodeNum ==0 ){
res.add(new ArrayList<Integer>(arr));
arr.clear();
nodeNum = next;
next = 0;
}
}
return res;
}
}