题意:给定二叉树,按层次遍历的顺序返回其值
初步分析:
用队列广度优先搜索。
其实广搜是比深搜(递归)好理解的,因为递归抽象。我们用队列来模拟广搜。队列就是先进队,先处理。我们按照从上到下,从左到右进队,取出来(即处理)的顺序任然是这样。我们只要队列不为空的时候,先处理,后放入,但是!有可能这一层的结点还没有取出来完,新一层的结点就已经进来了,因为一次取出处理一个,但是对应的却放入队列两个(如果左右都有的话),所以可能队列里有多层的,虽然他们仍然会按照顺序处理完,但是!这个题的关键在于,要区分每一层,所以,我们要对每一层循环处理!
代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> lists = new ArrayList<>();
if(root == null)
return lists;
Queue<TreeNode> queue = new LinkedList();
TreeNode node = root;
queue.add(node);
while(!queue.isEmpty())
{
List<Integer> list = new ArrayList<>();
int layer = queue.size(); //记录当前层的结点个数
while(layer != 0) //把当前层的结点取出来处理完(不是整个队列处理完),处理完后队列里的结点恰好是下一层所有的结点。
{
node = queue.poll();
list.add(node.val);
if(node.left != null)
queue.add(node.left);
if(node.right != null)
queue.add(node.right);
layer--;
}
lists.add(list);
}
return lists;
}
}