树的广度优先遍历(Breadth-First Traversal),也称为层次遍历,是一种按层次顺序逐级访问树节点的遍历方式。在广度优先遍历中,先访问树的根节点,然后按照从上到下、从左到右的顺序逐层访问树的节点。
首先将树的根节点入队列,然后循环执行以下操作:出队列一个节点,对该节点进行处理,然后将该节点的所有子节点按顺序入队列。通过不断出队列和入队列的操作,可以按照层次顺序逐级遍历树的节点,直到队列为空。
广度优先遍历保证了在访问某一层节点之前,先访问上一层的所有节点。这种遍历方式通常适用于需要按层次分析树结构的情况,比如求解最短路径、最小生成树等问题。
值得注意的是,广度优先遍历仅适用于无向树或有向无环图。对于有向有环图,由于存在环路,可能导致遍历陷入死循环。
图的广度优先遍历(Breadth-First Traversal),也称为宽度优先搜索(BFS),是一种遍历图的算法。在广度优先遍历中,从图中的某个起始节点开始,逐层遍历图的节点,先访问当前节点的所有邻接节点,然后再按顺序访问邻接节点的邻接节点,以此类推,直到遍历完图中所有可达节点。
下面是图的广度优先遍历的代码:
package BFS;import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;/*** 图的广度优先遍历(BFS)* @author wushaopei* @create 2023-06-05 10:04*/
public class GraphBFS {private Graph G; // 图对象private boolean[] visited; // 记录顶点是否访问过private List<Integer> order; // 记录顶点的遍历顺序public GraphBFS(Graph G) {this.G = G;visited = new boolean[G.V()];order = new ArrayList<>(G.V());for (int v = 0; v < G.V(); v++) {if (!visited[v]) {bfs(v); // 对未访问过的顶点进行BFS}}}private void bfs(int s) {Queue<Integer> queue = new LinkedList<>(); // 创建队列用于存储待访问顶点queue.add(s); // 将起始顶点入队visited[s] = true; // 标记起始顶点为已访问while (!queue.isEmpty()) { // 当队列不为空时,继续遍历int v = queue.remove(); // 出队一个顶点vorder.add(v); // 将v添加到遍历顺序中for (int w : G.adj(v)) { // 遍历v的邻接顶点wif (!visited[w]) { // 如果w未被访问过visited[w] = true; // 标记w为已访问order.add(w); // 将w入队}}}}public Iterable<Integer> order() {return order; // 返回顶点的遍历顺序}public static void main(String[] args) {Graph graph = new Graph("cc.txt");GraphBFS graphBFS = new GraphBFS(graph);System.out.println(graphBFS.order());}
}
在上述代码中,使用了一个队列来辅助实现广度优先遍历。首先将起始节点入队列,然后循环执行以下操作:出队列一个节点,对该节点进行处理,并将其标记为已访问,然后将该节点的未访问过的邻接节点按顺序入队列。通过不断出队列和入队列的操作,可以按照广度优先的顺序遍历图中的节点。
广度优先遍历的特点是从起始节点开始逐层向外扩展,先访问离起始节点最近的节点,再访问稍远的节点,直到遍历到图中所有可达节点。这种遍历方式可以用于求解最短路径、连通性问题等。
值得注意的是,在处理图的广度优先遍历时,需要使用额外的数据结构来记录已访问的节点,以防止重复访问和陷入循环。常用的数据结构有集合(Set)或标记数组等。
如果两个顶点在同一个联通分量中,那么它们之间一定存在路径。联通分量是指图中的一组顶点,这些顶点之间可以相互连通,通过边进行路径的传递。
单源路径问题是指在给定的图中,找到从单个源顶点到其他所有顶点的路径。下面是使用广度优先搜索(DFS)来解决单源路径问题的步骤:
package BFS;/*** @author wushaopei* @create 2023-06-05 10:35*/
import java.util.*;/*** 图的广度优先遍历(BFS)* @author wushaopei* @create 2023-06-05 10:04*/
/*** 图的单源路径问题,使用广度优先遍历(BFS)求解*/
public class SingleSourcePath {private Graph G; // 图对象private boolean[] visited; // 记录顶点是否访问过private int s; // 源顶点private int[] pre; // 记录顶点在路径中的前一个顶点public SingleSourcePath(Graph G, int s) {this.G = G;this.s = s;visited = new boolean[G.V()]; // 初始化visited数组,默认所有顶点未访问pre = new int[G.V()]; // 初始化pre数组,默认所有顶点前一个顶点为-1for (int v = 0; v < G.V(); v++) {pre[v] = -1;}bfs(s); // 从源顶点s开始进行BFS遍历}private void bfs(int s) {Queue<Integer> queue = new LinkedList<>(); // 创建队列用于存储待访问顶点queue.add(s); // 将源顶点s入队visited[s] = true; // 标记源顶点s为已访问while (!queue.isEmpty()) { // 当队列不为空时,继续遍历int v = queue.poll(); // 出队一个顶点vfor (int w : G.adj(v)) { // 遍历顶点v的邻接顶点wif (!visited[w]) { // 如果w未被访问过queue.add(w); // 将w入队visited[w] = true; // 标记w为已访问pre[w] = v; // 设置w在路径中的前一个顶点为v}}}}public boolean isConnectedTo(int t) {G.validateVertex(t); // 验证目标顶点t是否合法return visited[t]; // 返回目标顶点t是否与源顶点s相连}public Iterable<Integer> path(int t) {List<Integer> res = new ArrayList<>();if (!isConnectedTo(t)) return res; // 若目标顶点t与源顶点s不相连,则返回空路径int cur = t;while (cur != s) {res.add(cur); // 将当前顶点加入路径中cur = pre[cur]; // 更新当前顶点为其前一个顶点}res.add(s); // 将源顶点s加入路径中Collections.reverse(res); // 反转路径列表,得到从源顶点s到目标顶点t的路径return res; // 返回路径列表}public static void main(String[] args) {Graph graph = new Graph("cc.txt");SingleSourcePath singleSourcePath = new SingleSourcePath(graph, 0);System.out.println(singleSourcePath.path(6)); // 打印从源顶点0到顶点6的路径}
}
通过广度优先遍历算法,从源顶点s
开始逐层遍历图中的顶点,通过队列的先进先出特性,保证了路径的最短性。在遍历过程中,记录每个顶点的前驱顶点,最终可以通过回溯路径找到从源顶点到目标顶点的路径。
深度优先遍历:
广度优先遍历:
路径比较:
综上所述,广度优先遍历具有以下优势:
package BFS;/*** @author wushaopei* @create 2023-06-05 10:35*/
import java.util.*;/*** 图的广度优先遍历(BFS)* @author wushaopei* @create 2023-06-05 10:04*//*** 图的单源路径问题,使用广度优先遍历(BFS)求解*/
public class USSSPath {private Graph G; // 图对象private boolean[] visited; // 记录顶点是否访问过private int s; // 源顶点private int[] pre; // 记录顶点在路径中的前一个顶点private int[] dis;public USSSPath(Graph G, int s) {this.G = G;this.s = s;visited = new boolean[G.V()]; // 初始化visited数组,默认所有顶点未访问pre = new int[G.V()]; // 初始化pre数组,默认所有顶点前一个顶点为-1dis = new int[G.V()];for (int v = 0; v < G.V(); v++) {pre[v] = -1;}bfs(s,dis); // 从源顶点s开始进行BFS遍历}private void bfs(int s, int[] dis) {Queue<Integer> queue = new LinkedList<>(); // 创建队列用于存储待访问顶点queue.add(s); // 将源顶点s入队visited[s] = true; // 标记源顶点s为已访问dis[s] = 0;while (!queue.isEmpty()) { // 当队列不为空时,继续遍历int v = queue.poll(); // 出队一个顶点vfor (int w : G.adj(v)) { // 遍历顶点v的邻接顶点wif (!visited[w]) { // 如果w未被访问过queue.add(w); // 将w入队visited[w] = true; // 标记w为已访问pre[w] = v; // 设置w在路径中的前一个顶点为vdis[w] = dis[v] + 1;}}}}public boolean isConnectedTo(int t) {G.validateVertex(t); // 验证目标顶点t是否合法return visited[t]; // 返回目标顶点t是否与源顶点s相连}public Iterable<Integer> path(int t) {List<Integer> res = new ArrayList<>();if (!isConnectedTo(t)) return res; // 若目标顶点t与源顶点s不相连,则返回空路径int cur = t;while (cur != s) {res.add(cur); // 将当前顶点加入路径中cur = pre[cur]; // 更新当前顶点为其前一个顶点}res.add(s); // 将源顶点s加入路径中Collections.reverse(res); // 反转路径列表,得到从源顶点s到目标顶点t的路径return res; // 返回路径列表}public int dis(int s){G.validateVertex(s);return dis[s];}public static void main(String[] args) {Graph graph = new Graph("g.txt");USSSPath usssPath = new USSSPath(graph, 0);System.out.println(usssPath.path(6)); // 打印从源顶点0到顶点6的路径System.out.println(usssPath.dis(3)); // 打印源到顶点的路径长度}
}
该代码实现了使用广度优先遍历求解图的单源路径问题,并提供了打印路径和计算最短距离的功能。在主方法中,通过创建图对象和USSSPath
对象,可以对图进行处理并输出结果。
玻璃钢生产厂家福州玻璃钢白熊雕塑西宁玻璃钢雕塑订做宣城玻璃钢雕塑批发兰州玻璃钢人物雕塑制作淮南水果玻璃钢雕塑定做价格商场户外美陈报价荆门玻璃钢雕塑天津玻璃钢雕塑设计商青岛玻璃钢花盆研究玻璃钢卡通公仔雕塑厂玻璃钢放鞭炮人物主题景观雕塑山东大型商场美陈多少钱濮阳玻璃钢人物泡沫雕塑党建文化玻璃钢人物雕塑批发玻璃钢喷泉雕塑价格广东室内商场美陈订购常见商场美陈供应商玻璃钢自行车人物雕塑什么牌子的玻璃钢雕塑偃师玻璃钢雕塑设计青岛茂名玻璃钢卡通雕塑白云商场美陈咸阳玻璃钢座椅雕塑无锡天河玻璃钢人物雕塑绍兴玻璃钢蝴蝶雕塑宝鸡市玻璃钢雕塑佛山玻璃钢卡通人偶雕塑玻璃钢雕塑复古怎么做深圳红色革命主题玻璃钢雕塑玻璃钢卡通雕塑羊定做香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万