图的遍历
一、深度优先遍历
深度优先遍历我们用递归来实现(笔者暂时还不知道有没有非递归方法)
递归的第一步,也就是当我们遍历到这个节点的时候,我们应该做两件事,第一件事是我们想要做的,我们遍历这个节点为的是什么,也就是访问函数;第二件事,这个节点有没有递归过,我们应该有记录,如果没有记录递归将无法结束,在第二件事中我们置节点的标记为”已访问“
第二步,找到下一个节点并递归,记录是否递归是在第一步,根据这个记录寻找下一个被访问的节点是第二步,找到之后我们就可以直接对这个节点进行深度优先遍历,
递归如何结束呢?在某一个dfs找了以这个节点为弧尾的所有弧头节点,而且他们都被访问过的时候,这个dfs就应该结束并且向上返回了,向上返回之后,接着没有进行完的第二步进行,等到像之前一样找了所有的节点之后,这个向上的节点的dfs也应该结束,并向上,循环~
二、广度优先遍历
首先我们来看一个例子,图的广度优先遍历非常像树的层次遍历,广度优先遍历的算法是这样的,我们有一个队列,当访问一个父节点的时候,我们就把他的子节点放到队列里,访问完成之后就把父节点出掉,访问完成之后我们不要去访问子节点,而是去访问这个队列里的下一个节点,这个下一个节点一定是上一个节点的兄弟节点,除非他没有兄弟节点,或者他是最后一个兄弟;
为了好理解,我们先不考虑优化,那么这个队列的长度最好就是图中的顶点数目;
这中间有这么几个关键的步骤,
- 找出一个节点的子节点,并把它装进队列中
- 让已经访问的出队列
首先要记得初始化访问数组,结束的标志是所有的顶点都已经出了,也就是所有的顶点都被访问

代码放到github,明天我在复习一下,折腾code::block折腾的我腰疼,tmd!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现