前言
广度优先搜索是一种广泛运用在树或图这类数据结构中,遍历或搜索的算法。 该算法从一个根节点开始,首先访问节点本身。 然后遍历它的相邻节点,其次遍历它的二级邻节点、三级邻节点。
当我们在树中进行广度优先搜索时,我们访问的节点的顺序是按照层序遍历顺序的。
一、题目
题目来源于leedcode
二、步骤
- 首先创建一个列表存放最终结果,创建一个队列存放结点
- 判断根节点是否为空,不为空则根结点入队列
- while循环判断队列是否有数据,当队列里有数据时,获取结点个数(可以知道这一层有几个数据)
- 创建一个列表,存放该层的数据
- for循环该层结点
- 通过poll()获取弹出的首元素,并将该元素结点添加到该层列表中
- 分贝判断该结点是否有左右孩子,如果有,则将左右结点压入列表
- 该层结点循环结束后,将该层列表数据添加到最终列表中并开启下一层数据的遍历直到队列中无数据为止。
- 返回最终结果
三、代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result=new ArrayList<>();
Queue<TreeNode> queue=new ArrayDeque<>();
if(root!=null){
queue.add(root);
}
while(!queue.isEmpty()){
int n=queue.size(); //获取结点个数(可以知道这一层有几个数据)方便向level列表里添加数据
List<Integer> level=new ArrayList<>();
for(int i=0;i<n;i++){
TreeNode node=queue.poll();//获取弹出的首元素
level.add(node.val);
if(node.left!=null){
queue.add(node.left);
}
if(node.right!=null){
queue.add(node.right);
}
}
result.add(level);
}
return result;
}
}