题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
思路
题目分析:
如上图所示,按层打印的顺序,应该先打印根结点,从树的根结点开始分析。为了接下来能够打印值为8的结点的两个子结点,我们应该在遍历该结点时把值为6和10的两个结点保存到一个容器里,现在容器内就有两个结点。按照从左到右打印的要求,我们先取出为6的结点。打印出值6之后把它的分别为5和7的两个结点放入数据容器。此时数据容器中有三个结点,值分别为10、5和7。接下来我们从数据容器中取出值为10的结点。注意到值为10的结点比值为5、7的结点先放入容器,此时又比这两个结点先取出,这就是我们通常说的先入先出,因此不难看出这个数据容器应该是一个队列。由于值为5、7、9、11的结点都没有子结点,因此只要依次取出打印即可。
层序遍历问题?
一开始的思路是对于给定的根节点,查询是否存在左右子节点,若存在,则打印并分别递归的查询子节点是否存在左右子节点。没有想到要将结点存放在容器中,而是直接获取结点的值,这样遍历二叉树,但是并不是层序遍历,不能保证每一层打印一行。
怎么确定一层已经遍历结束从而将下一层在另一行打印?
需要标志位来确定。
遍历过程如下:
代码实现:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
public class Solution {
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> tmp = new ArrayList<Integer>();
//队列存放结点,先进先出
Queue<TreeNode> nodes = new LinkedList<TreeNode>();
//now表示目前层还剩几个结点,next表示下一层有几个结点
int now = 1, next = 0;
//如果结点为空,则返回空
if(pRoot == null)
return res;
//将根节点添加
nodes.add(pRoot);
while( !nodes.isEmpty())
{
//每次取出一个结点,当前层剩余结点数减一
TreeNode node = nodes.remove();
now--;
tmp.add(node.val);
if(node.left!=null)
{
//查询左右子节点,若存在则放入队列中,下一层的节点数加一
nodes.add(node.left);
next++;
}
if(node.right != null)
{
nodes.add(node.right);
next++;
}
if(now == 0)
{
res.add(new ArrayList<Integer>(