宽度优先搜索(BFS, Breadth First
Search)是一个针对图和树的遍历算法。发明于上世纪50年代末60年代初,最初用于解决迷宫最短路径和网络路由等问题
第一种:使用map纪录层数
public static int maxWidthUseMap(Node head) {
if (head == null) {
return 0;
}
//队列
Queue<Node> queue = new LinkedList<>();
queue.add(head);//把头节点加入到队列中
//value表示key节点在那一层
HashMap<Node, Integer> levelMap = new HashMap<>();
//把头结点放在第一层
levelMap.put(head, 1);
int curLevel = 1;
int curLevelNodes = 0;
int max = 0;
while (!queue.isEmpty()) {
Node cur = queue.poll();
int curNodeLevel = levelMap.get(cur);
if (cur.left != null) {
//如果左孩子存在把左孩子存入map
levelMap.put(cur.left, curLevelNodes + 1);
//如果左孩子存在把左孩子加入队列
queue.add(cur.left);
}
if (cur.right != null) {
//如果右孩子存在把左孩子存入map
levelMap.put(cur.right, curLevelNodes + 1);
//如果右孩子存在把左孩子加入队列
queue.add(cur.right);
}
//如果还是在当前层 则当前层的节点个数++ 否则进入下一层并获得最大的节点个数
if (curNodeLevel == curLevel) {
curLevelNodes++;
} else {
max = Math.max(max, curLevelNodes);
curLevel++;
curLevelNodes = 1;
}
}
max = Math.max(max, curLevelNodes);
return max;
}
第二种:不使用map
public static int maxWidthNoMap(Node head) {
if(head==null) {
return 0;
}
//定义队列
Queue<Node> queue=new LinkedList<>();
//把头结点加入到队列
queue.add(head);
//当前层的最右节点
Node curEnd=head;
//下一层的最右节点
Node nextEnd=null;
int max=0;
int curLevelNodes=0;
while(!queue.isEmpty()) {
//出队列
Node cur=queue.poll();
//当前节点有左孩子 将左孩子入队列 并将左孩子暂时置为下一行的最后一个节点
if(cur.left!=null) {
queue.add(cur.left);
nextEnd=cur.left;
}
//当前节点有右孩子 将右孩子入队列 并将右孩子暂时置为下一行的最后一个节点
if(cur.right!=null) {
queue.add(cur.right);
nextEnd=cur.right;
}
curLevelNodes++;//记录当前出队列的节点++
//当到当前层的最后一个节点后 开始进入下一层的遍历
//更新最大节点数 当前层节点数置为0 下一层的最后一个节点设为当前层的最后一个节点
if(cur==curEnd) {
max=Math.max(max, curLevelNodes);
curLevelNodes=0;
curEnd=nextEnd;
}
}
return max;
}