1题目描述:
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
2.解题思路
本题可类比剑指offer第22题:从上往下打印二叉树,这两道题实际上是一回事,只不过这里我们多了一个分行打印的要求,实际上大同小异,稍加修改即可。
在二叉树层次遍历上,我们使用的是队列,借助队列先进先出的性质实现,具体规律:每次打印一个结点时,如果该结点有子结点,则将子结点放到队列的末尾,接下来取出队列的头重复前面的打印动作,直到队列中所有的结点都打印完毕。在此基础上我们考虑这里的分行要求,不难想到我们只要增加两个变量即可:一个用于保存当前层中还没有打印的结点个数,另一个用于记录下一层结点的数目。而使用队列的话,实际上这两个变量可以统一用队列的长度来实现。
3.编程实现(Java):
public class PrintTree_37 {
public static void main(String[] args) {
TreeNode root = new TreeNode(8);
root.left = new TreeNode(6);
root.right = new TreeNode(10);
root.left.left = new TreeNode(5);
root.left.right = new TreeNode(7);
root.right.left = new TreeNode(9);
root.right.right = new TreeNode(11);
System.out.println(Print(root));
}
static ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
//新建一个二维可变数组,用于存放需要分层打印的二叉树
ArrayList<ArrayList<Integer>> result = new ArrayList<>();
if (pRoot == null)
return result;
//新建一个队列,用于存放当前层需要打印的节点,用于一层一层放进row里面
Queue<TreeNode> queue = new LinkedList<>();
queue.add(pRoot);
while (!queue.isEmpty()) {
//每次都新建一个空的一维可变数组,用于存放一层的节点
ArrayList<Integer> line = new ArrayList<>();
int len = queue.size();
for (int i = 0; i < len; i++) {
TreeNode temp = queue.poll();
if (temp.left != null)
queue.add(temp.left);
if (temp.right != null)
queue.add(temp.right);
line.add(temp.val);
}
result.add(line);
}
return result;
}
}
输出: