【算法笔记】BFS算法--解决一类二叉树层序打印题

参考:labuladong算法小抄
BFS 的核心思想就是把一些问题抽象成图,从一个点开始,向四周开始扩散。写 BFS 算法都是用「队列」这种数据结构,每次将一个节点周围的所有节点加入队列
BFS 相对 DFS 的最主要的区别是:BFS 找到的路径一定是最短的,但代价就是空间复杂度比 DFS 大很多。

通用框架:

// 计算从起点 start 到终点 target 的最近距离
int BFS(Node start, Node target) {
    Queue<Node> q; // 核心数据结构
    Set<Node> visited; // 避免走回头路

    q.offer(start); // 将起点加入队列
    visited.add(start);
    int step = 0; // 记录扩散的步数

    while (q not empty) {
        int sz = q.size();
        /* 将当前队列中的所有节点向四周扩散 */
        for (int i = 0; i < sz; i++) {
            Node cur = q.poll();
            /* 划重点:这里判断是否到达终点 */
            if (cur is target)
                return step;
            /* 将 cur 的相邻节点加入队列 */
            for (Node x : cur.adj())
                if (x not in visited) {
                    q.offer(x);
                    visited.add(x);
                }
        }
        /* 划重点:更新步数在这里 */
        step++;
    }
}

例子

1、JZ22 从上往下打印出二叉树的每个节点,同层节点从左至右打印。
2、JZ59请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
3、NC80 从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
4、JZ38 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

void bfs() {
 	int level = 0;
 	vis[] = {0}; // or set
 	queue<int> pq(original_val);
	while (!pq.empty()) {
		int sz = pq.size();

    	 while (sz--) {
         	int cur = pq.front(); pq.pop();
         	for (遍历cur所有的相邻节点nex) {
	        	if (nex节点有效 && vis[nex] == 0) {
	                 vis[nex] = 1;
	                 pq.push(nex)
	            }
         	} // end for
     	} // end inner while
     level++;
 	} // end outer while
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值