面试常见的两种宽(深)度优先(BFS)遍历 Java实现(附有详细解析)

宽度优先搜索(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;
	}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

、信仰_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值