当前位置: 首页 > article >正文

树的宽度优先遍历(c++)

 宽度优先遍历,又名广度优先遍历或层序遍历,英文缩写为BFS,全称是 Breadth First Search,也是一种用于遍历或搜索树或图的算法。所谓宽度优先,就是每次都尝试访问同一层的节点。如果同一层都访问完了,再访问下一层。

  1. 创建一个队列,辅助 BFS
  2. 根结点入队
  3. 若队列不为空,队头结点出队并访问该结点,然后将该点的孩子依次入队
  4. 重复 3 过程,直到队列为空

 代码1: 

//vector存储树
#include <iostream>
#include <queue>
#include <vector>
using namespace std;

const int N = 1e5 + 10;
int n;
vector<int> edges[N]; //存树
bool st[N]; //标记哪些结点已经访问过了

void bfs()
{
	queue<int> q;
	q.push(1);
	st[1] = true;

	while (q.size())
	{
		int u = q.front(); q.pop();
		cout << u << " ";

		for (auto v : edges[u])
		{
			if (!st[v])
			{
				q.push(v);
				st[v] = true;
			}
		}
	}
}

int main()
{
	cin >> n;
	for (int i = 1; i < n; ++i)
	{
		int a, b; cin >> a >> b;
		edges[a].push_back(b);
		edges[b].push_back(a);
	}

	bfs();

	return 0;
}

 代码2:


//链式存储树
#include <iostream>
#include <queue>
using namespace std;

const int N = 1e5 + 10;
int h[N], e[N * 2], ne[N * 2], id;
int n;
bool st[N]; //标记哪些结点已经访问过了

void add(int a, int b)
{
	++id;
	e[id] = b;

	ne[id] = h[a];
	h[a] = id;
}

void bfs()
{
	queue<int> q;
	q.push(1);
	st[1] = true;

	while (q.size())
	{
		int u = q.front(); q.pop();
		cout << u << " ";

		for (int i = h[u]; i; i = ne[i])
		{
			int v = e[i];
			if (!st[v])
			{
				q.push(v);
				st[v] = true;
			}
		}
	}
}

int main()
{
	建树
	cin >> n;
	for (int i = 1; i < n; ++i)
	{
		int a, b; cin >> a >> b;
		add(a, b); add(b, a);
	}

	bfs();

	return 0;
}


http://www.kler.cn/a/516142.html

相关文章:

  • 算法竞赛之离散化技巧 python
  • nginx分发请求超时切换服务
  • centos9编译安装opensips 二【进阶篇-定制目录+模块】推荐
  • 详细介绍:Kubernetes(K8s)的技术架构(核心概念、调度和资源管理、安全性、持续集成与持续部署、网络和服务发现)
  • SpringBoot集成Flink-CDC,实现对数据库数据的监听
  • STM32-CAN总线
  • 头歌实训作业 算法设计与分析-贪心算法(第2关:最优装载问题)
  • 性能测试监控与诊断
  • ARM64平台Flutter环境搭建
  • EF Core 乐观、悲观并发控制
  • spring-springboot -springcloud
  • Sophon边缘盒数据校验及量化
  • Java拓展学习——Process类的学习和使用
  • mysql 计算2个时间段之间的间距
  • 差分轮算法-两个轮子计算速度的方法-阿克曼四轮小车计算方法
  • 从新手到高手的蜕变:MySQL 视图进阶全攻略
  • 不使用 JS 纯 CSS 获取屏幕宽高
  • 单片机内存管理剖析
  • 【Python模块】使用sys.path查看当前的模块搜索路径
  • Spring AOT
  • 2025-1-20-sklearn学习(42) 使用scikit-learn计算 钿车罗帕,相逢处,自有暗尘随马。
  • Linux网络之TCP
  • GOAT‘S AI早鸟报Part10
  • MFC程序设计(三)MFC程序启动
  • 动态路由协议基础知识
  • JavaScript系列(42)--路由系统实现详解