题目:从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
从上到下按层打印二叉树,其实就是二叉树的层序遍历,也可以说是广度优先遍历(DFS)二叉树。当遇到广度优先遍历一个有向图或者一棵二叉树时,首先要想到的就是队列(先入先出)这种数据结构。首先遍历二叉树的树根,并将根结点添加到队列尾部,然后从队列头部取出一个节点打印出来,并将其左、右子结点依次添加到队列尾部。接下来,每次从队列头部取出一个结点,遍历这个结点之后把它所能到达的所有结点依次添加到队列尾部。重复这个遍历过程,直到队列中的所有结点都被遍历过为止。
由于这道题目的要求是分行打印,所以我们还要额外定义2个变量:
第一个变量表示下一层结点的数目;
第二个变量表示当前层中还没有打印的结点的数目。
Java代码如下:
import java.util.ArrayList;
import java.util.*;
/*
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<ArrayList<Integer>> allList = new ArrayList<ArrayList<Integer>>();
if(pRoot == null)
return allList;
//广度优先遍历有向图或者二叉树,都是基于队列实现的。
Queue<TreeNode> queue = new LinkedList<TreeNode>();//LinkedList类实现了Queue接口
queue.offer(pRoot);//在队列尾部添加元素,如果队列已满,则返回false
//定义2个变量
int nextLevel = 0;//下一层的结点数目
int toBePrinted = 1;//当前层中还没有打印的结点数目
TreeNode curNode = null;//当前遍历到的结点,局部变量在定义后如果没有赋初始值是不能使用的。
ArrayList<Integer> list = new ArrayList<Integer>();
while(!queue.isEmpty())//测试此队列是否为空
{
curNode = queue.poll();//获取并移除队列首部的元素
System.out.print(curNode.val + " ");
list.add(curNode.val);
//同一层中从左到右打印
if(curNode.left != null)
{
queue.offer(curNode.left);
nextLevel++;
}
if(curNode.right != null)
{
queue.offer(curNode.right);
nextLevel++;
}
toBePrinted--;
if(toBePrinted == 0)
{
allList.add(list);
System.out.println();//换行
list = new ArrayList<Integer>();
toBePrinted = nextLevel;
nextLevel = 0;
}
}
return allList;
}
}