| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 数据结构 --- 图的遍历DFS、BFS -> 正文阅读 |
|
[数据结构与算法]数据结构 --- 图的遍历DFS、BFS |
什么是DFS、BFS?一条线走到底,深度优先遍历,每一个顶点只遍历、只打印一次的方式:DFS、BFS ?????? 数据结构 --- 图的存储_考拉爱睡觉鸭~的博客-CSDN博客 ??? 单纯地把邻接顶点的邻接顶点打印出来,顶点重复遍历,打印多次 从 A→F 所有的节点都遍历完了,需要做回退,从F回退到D点,找D点有没有邻接顶点,没有邻接顶点,继续做回退,退到B节点,有未访问的邻接顶点,访问C顶点 如果遍历的节点已经被遍历了,不能重复遍历,要做回退 如果形成环状,也是重复遍历的情况,也要做回退 要做回退,用栈实现 当前节点如果不存在邻接顶点,就要做出栈操作 先把 A 的所有邻接顶点 B、C 遍历,按照当前节点的邻接顶点的遍历顺序做下一次遍历,如果 B 先遍历,就遍历 B 的所有邻接顶点,由于 B 的邻接顶点 C 已经被遍历了所以不需要遍历 做遍历时要判断当前节点是否被遍历,如果被遍历了就不需要遍历 用队列实现,通过出队的方式决定下一次遍历的顺序 先遍历 A,遍历 A 后,遍历 A 的邻接顶点 B、C,把 B、C 入队,当遍历完 A 的所有邻接顶点后,B出队,访问B的所有邻接顶点D,D访问完后入队,B没有邻接顶点,出队C,访问C的邻接顶点,C的邻接顶点为E,入队E 队列为空,整个图就遍历完成了 DFS 实现连接方式与边的插入方式有关 准备一个栈,栈中存储的是位置 LPNODE,要做回退 邻接链表中的节点实际存的是序号,把序号拿出来 ①从 A 入口进来,遍历 A 的横向链表,把 C 节点遍历完,入栈 ②跳到 C 数组的位置,从 C 数组的位置,横向遍历 E 节点(跳到以 C 为头的横向链表中 C → E ),遍历完 E 节点后,跳到 E 的位置,遍历它的邻接顶点,E 的邻接顶点是 C,C 已经被遍历了,要做回退,退到链表 E 的位置,访问下一个邻接顶点,下一个邻接顶点没有被访问就访问. . . 数据结构 --- 图的存储_考拉爱睡觉鸭~的博客-CSDN博客 横向遍历的特点:从链表中找一个没有被访问的节点遍历,只要找到一个即可
BFS 实现连接方式与边的插入方式有关 ①从 A 入口进来,把整个 A 的横向链表遍历完,遍历到空的位置结束 ②把序号(位置)做入队操作:要知道哪个顶点是先遍历的,作为下一次遍历的依据,只需要准备一个队列,存放序号即可,不需要存节点,例如:B 节点是序号 1,c 节点是序号 2,只需要把 1,2 入队即可 ③把 A 的横向链表遍历完后,1 出队,直接走到 1 的位置,做横向遍历,把 B 的横向链表遍历完 ④注意要防止重复遍历,重复遍历的不做遍历,只遍历 D,F 即可,访问的节点也需要有一个标记,把 B 的横向链表遍历完后也需要把序号3、5入队 ⑤把 2 出队. . . 把整个横向链表遍历完,已经做遍历的,不做遍历 可以用循环队列,普通队列如果节点过多,会出现伪溢出
测试代码
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 9:39:49- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |