1. 本题知识点
树
2. 题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
3. 解题思路
- 创建一个队列。创建一个线性表,其中一个元素是一层二叉树。
- 将二叉树的根节点加入队尾
- 当队列不为空时,执行以下循环
- 记录本层二叉树的结点数
- 当本层二叉树的结点数大于 0,执行以下循环
- 删除队头
- 将删除的队头加入本层二叉树的线性表
- 将删除的队头的左右子树加入队尾
- 本层二叉树结点树减 1
- 将本层二叉树的线性表加入线性表
- 返回线性表
4. 代码
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public class Solution {
/**
* 从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
*
* @param pRoot
* @return
*/
ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
// 创建一个队列
Queue<TreeNode> queue = new LinkedList<>();
// 创建一个线性表,其中一个元素是一层二叉树
ArrayList<ArrayList<Integer>> lists = new ArrayList<>();
// 根节点不为空时,将其加入队尾
if (pRoot != null) {
queue.add(pRoot);
}
// 队列不为空时,执行循环
while (!queue.isEmpty()) {
ArrayList<Integer> list = new ArrayList<>();
// 本层二叉树的结点数
int count = queue.size();
// 本层二叉树的结点数大于 0,执行循环
while (count > 0) {
// 删除队头
TreeNode removeNode = queue.remove();
// 将删除的队头加入线性表
list.add(removeNode.val);
// 如果删除的队头有左子树,将其加入队尾
if (removeNode.left != null) {
queue.add(removeNode.left);
}
// 如果删除的队头有右子树,将其加入队尾
if (removeNode.right != null) {
queue.add(removeNode.right);
}
// 本层二叉树结点树减 1
count--;
}
// 将本层二叉树加入线性表
if (list.size() != 0) {
lists.add(list);
}
}
return lists;
}
}