(一).基础概念
队列,这个就不用多介绍了。在前面介绍数据结构的时候,介绍过。
宽搜,就是宽度优先搜索,和层序遍历一样。宽搜广泛应用于树型结构,图论,最短路问题,迷宫问题等等。宽搜属于搜索类的算法,还有一个就是深搜
(二).具体题目
1.N叉树的层序遍历

解法:BFS

java
public List<List<Integer>> levelOrder(Node root) {
List<List<Integer>> ret=new ArrayList<>();
if (root==null){
return ret;
}
Queue<Node> queue=new ArrayDeque<>();
queue.add(root);
while (!queue.isEmpty()){
List<Integer> list=new ArrayList<>();
int sz=queue.size();
for (int i = 0; i < sz; i++) {
Node poll = queue.poll();
list.add(poll.val);
for(Node node:poll.children){
queue.add(node);
}
}
ret.add(list);
}
return ret;
}
2.二叉树的锯齿形层次遍历
103. 二叉树的锯齿形层序遍历 - 力扣(LeetCode)

解法:使用队列进行层次遍历

java
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> ret=new ArrayList<>();
if (root==null){
return ret;
}
Queue<TreeNode> queue=new ArrayDeque<>();
boolean isReverse=false;
queue.add(root);
while (!queue.isEmpty()){
List<Integer> list=new ArrayList<>();
int sz=queue.size();
for (int i = 0; i < sz; i++) {
TreeNode poll = queue.poll();
if (poll.left!=null){
queue.add(poll.left);
}
if (poll.right!=null){
queue.add(poll.right);
}
list.add(poll.val);
}
if (!isReverse){
isReverse=true;
}else{
Collections.reverse(list);
isReverse=false;
}
ret.add(list);
}
return ret;
}
3.二叉树的最大宽度

解法:利用数组存储二叉树的方式,进行编号

java
public int widthOfBinaryTree(TreeNode root) {
List<Pair<TreeNode,Integer>> arr=new ArrayList<>(); //使用数组模拟队列
int ans=1; //记录最终结果
arr.add(new Pair<>(root,1));
while (!arr.isEmpty()){
//更新这一层的宽度
Pair<TreeNode,Integer> t1=arr.get(0);
Pair<TreeNode,Integer> t2=arr.get(arr.size()-1);
ans = Math.max(ans,t2.getValue()-t1.getValue()+1);
//让下一层入队
List<Pair<TreeNode,Integer>> temp=new ArrayList<>();
for(Pair<TreeNode,Integer> t:arr){
TreeNode node=t.getKey();
Integer index=t.getValue();
if (node.left!=null){
temp.add(new Pair(node.left,2*index));
}
if (node.right!=null){
temp.add(new Pair(node.right,2*index+1));
}
}
arr=temp;//让新的数组覆盖之前的数组
}
return ans;
}
4.在每个树行中找最大值
515. 在每个树行中找最大值 - 力扣(LeetCode)

解法:使用队列,利用层次遍历,统计出每一层的最大值

java
public List<Integer> largestValues(TreeNode root) {
List<Integer> ret=new ArrayList<>();
if (root==null){
return ret;
}
Queue<TreeNode> queue=new ArrayDeque<>();
queue.add(root);
while (!queue.isEmpty()){
int sz=queue.size();
int max=Integer.MIN_VALUE;
for (int i = 0; i < sz; i++) {
TreeNode poll = queue.poll();
if (poll.left!=null){
queue.add(poll.left);
}
if (poll.right!=null){
queue.add(poll.right);
}
if (max<poll.val){
max=poll.val;
}
}
ret.add(max);
}
return ret;
}