以数据结构之——树来体会深度优先搜索【dfs】和广度优先搜索【bfs】的妙用:学比特算法课的自用笔记

目录

声明:学比特算法课后的自用笔记。

一、深度优先搜索算法就是一条路走到黑再回头,不撞南墙不回头。

树中的dfs思想:

例题:【输出深度优先搜索的结果】

运行的结果图:

可执行代码+注释:

运行结果:

输入:

输入+输出:

二、广度优先搜索算法也叫宽度优先搜索算法也叫层序遍历:就是从根节点往子节点一层一层从左往后的去遍历。

树中的bfs思想:

以上面的那个例题为例:【输出广度优先搜索的结果】

运行后的效果图:

可执行代码+注释:

运行结果:

输入:

输入+输出:


声明:学比特算法课后的自用笔记。

一、深度优先搜索算法就是一条路走到黑再回头,不撞南墙不回头。

树中的dfs思想:

例题:【输出深度优先搜索的结果】

运行的结果图:

可执行代码+注释:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const unsigned long long N=1e6+10;
long long n;
vector<long long> edges[N];//由于可能是无根树【不确定哪一个是父节点,所以每一个顶点的容器中包含了直接边相连的所有顶点,然后输出一个排除一个顶点】 
bool st[N];//为了避免同一个顶点多次被输出,所以每一个已输出的顶点都做好标记,以后不会再被访问到 
void dfs(long long u){//深度优先搜索的核心代码 
	cout<<u<<" ";
	st[u]=true;//将已输出的代码做好标记 
	for(vector<long long>::iterator it=edges[u].begin();it!=edges[u].end();it++){//遍历u这个顶点的所有边相连顶点 
		if(st[*it]==false) dfs(*it);
	}
}
int main(){
cin>>n;//输入n个顶点 
while(n>1){//n个顶点的树有n-1条边 
	long long a=0,b=0;
	cin>>a>>b;//n-1条边中的每条边两端的顶点分别是a和b 
	edges[a].push_back(b);
	edges[b].push_back(a);
	n--;
}
dfs(1);//deep深度,所以dfs是深度优先搜索,第一个访问的节点。 
	return 0;
}

运行结果:

输入:

输入+输出:

二、广度优先搜索算法也叫宽度优先搜索算法也叫层序遍历:就是从根节点往子节点一层一层从左往后的去遍历。

树中的bfs思想:

以上面的那个例题为例:【输出广度优先搜索的结果】

运行后的效果图:

可执行代码+注释:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const unsigned long long N=1e6+10;
long long n;
vector<long long> edges[N];//由于可能是无根树【不确定哪一个是父节点,所以每一个顶点的容器中包含了直接边相连的所有顶点,然后输出一个排除一个顶点】 
queue<long long> p;//采用队列的方式,一层一层的入队,当本层都入队后,输出该层的左边元素并入队该元素的子节点,一步步来,当队空时广度优先搜索就结束了 
bool st[N];
void bfs(){
	p.push(1);
	while(!p.empty()){//如果队列不为空就一直循环入队出队的操作 
		if(!st[p.front()]){//队头的这个元素没有输出过,并且它已经没有同层(行)的节点了,可以输出了 
		cout<<p.front()<<" ";
		st[p.front()]=true;//队头的这个元素已经被输出过了,所以打上标记,以后遇到这个元素不能再重复输出了 
		int u=p.front();
		p.pop();//队头元素的作用用完了,该输出了 
		for(vector<long long>::iterator it=edges[u].begin();it!=edges[u].end();it++){//输出队头的同时入队队头的子节点 
			if(!st[*it]){
				p.push(*it);
			}
		}
		}
		
	}
}
int main(){
cin>>n;//输入n个顶点 
while(n>1){//n个顶点的树有n-1条边 
long long a,b;
cin>>a>>b;
edges[a].push_back(b);
edges[b].push_back(a);
n--;
}
bfs();
	return 0;
}

运行结果:

输入:

输入+输出:

相关推荐
BadBadBad__AK25 分钟前
线段树维护区间 k 次方和
c++·数学·算法·stl
卷无止境12 小时前
Eigen 库如何借助 OpenMP 加速计算
c++·后端
卷无止境13 小时前
OpenMPI、MPICH 与 OpenMP:关系、核心概念与架构全解
c++·后端
郝学胜_神的一滴1 天前
CMake 30:循环语法全解|foreach_while双循环精讲、迭代技巧与实战避坑指南
c++·cmake
刘马想放假2 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠3 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
卷无止境3 天前
C++ 的Eigen 库全解析
c++
卷无止境3 天前
现代 C++特性大盘点:一门脱胎换骨的老语言
c++·后端
郝学胜_神的一滴4 天前
CMake 27:缓存变量的特性、语法、类型与实操全解
c++·cmake
博客18005 天前
酷宝的使用方法,超好用的免费界面库,C++、MFC可用
c++·mfc·界面库·库来帮·酷宝