题目描述:
给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)
例如:
给定的二叉树是{3,9,20,#,#,15,7},
3 / 9 20 / 15 7该二叉树层序遍历的结果是
[ [3], [9,20],[15,7]]
解题思路:
使用队列,这个题与普通的层序遍历稍有不同,最后返回的结果是list的集合,每一个list是一层的遍历(从左到右)
普通的层序遍历(一个list)只需要使用队列,进出进出即可, 每出一个node将其值添加到list中,直到队列变为空。
而现在,我们需要知道每一层有多少个node,具体实现看一下代码。
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public ArrayList<ArrayList<Integer>> levelOrder(TreeNode root) {
//存放最后的结果
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
if(root == null){
return result;
}
//借助队列先进先出的特性
Queue<TreeNode> queue = new LinkedList<TreeNode>();
//将根入队
queue.offer(root);
//当队列中没有元素时遍历结束
while(!queue.isEmpty()){
//循环一开始,队列中第一个元素一定是某一层中最左边的元素
//队列中的元素都是某一层的元素(从左到右),由for循环保证
ArrayList<Integer> b = new ArrayList<Integer>(); //存放一层数值的list
//一层的node数量
int levelnum = queue.size();
//根据levelnum将一层的node出队并记录其数值,且让其左右子树进队
for(int i = 0; i < levelnum; i++){
//使一层中最左边的node出队,并暂存此node
TreeNode temp = queue.poll();
//添加node数值
b.add(temp.val);
//左进队
if(temp.left != null)
queue.offer(temp.left);
//右进队
if(temp.right != null)
queue.offer(temp.right);
}
//添加一层数值的list
result.add(b);
}
return result;
}
}
代码问题:
一开始我是在while循环之前定义了ArrayList b,在result.add(b)之后用了b.clear(),这样做会出现问题,result也清空了。