层序遍历就是逐层遍历树结构。
广度优先搜索是一种广泛运用在树或图这类数据结构中,遍历或搜索的算法。 该算法从一个根节点开始,首先访问节点本身。 然后遍历它的相邻节点,其次遍历它的二级邻节点、三级邻节点,以此类推。
当我们在树中进行广度优先搜索时,我们访问的节点的顺序是按照层序遍历顺序的。
通常,我们使用一个叫做队列的数据结构来帮助我们做广度优先搜索。
解法
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*
*
* 1.首先将根节点放入队列中。
2.当队列为非空时,循环执行步骤3到步骤6,否则结束;
3.获取当前层的节点数
4.遍历当前层的节点
5.出队列取得一个结点,访问该结点
6. 若该结点的左子树为非空,则将该结点的左子树入队列;
若该结点的右子树为非空,则将该结点的右子树入队列;
7.结束。
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
// 如果为空树就直接返回
if (root == null) {
return result;
}
// 1:根结点进入队列
queue.offer(root);
// 2:若队列非空,循环执行步骤 3-6,否则结束。
while (!queue.isEmpty()) {
//3. 获取当前层的节点数.
int eleSize = queue.size();
List<Integer> subList = new ArrayList<Integer>();
// 4. 遍历当前层的节点
for (int i = 0; i < eleSize; i++) {
// 5. 队首出队并将value加入子list
TreeNode node = queue.poll();
subList.add(node.val);
// 6. 将非空左右子树加入queue
if (node.left != null) { // 如果队首的左结点不为空就把左结点入队
queue.offer(node.left);
}
if (node.right != null) { // 如果队首的右结点不为空就把右结点入队
queue.offer(node.right);
}
}
// 添加一层
result.add(subList);
}
return result;
}
}