首页 > 其他分享 >图的遍历

图的遍历

时间:2023-08-19 14:22:19浏览次数:26  
标签:ch temp boolean beTraversed 访问 遍历

图的遍历有多种方式,但是这里从数据结构基础出发,还是只介绍基础的两种方式,深度优先遍历和广度优先遍历。

深度优先遍历
图的深度优先搜索(Depth First Search),和树的前序遍历比较类似。

它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。

显然,深度优先搜索是一个递归的过程。一言以蔽之:“一路走到头,不撞南墙不回头”。

代码实现(邻接矩阵):

public void DFSSelf() {
boolean[] beTraversed = new boolean[size];
beTraversed[0] = true;
System.out.print(vertexs[0] + " ");
DFSSelf(0, beTraversed);//从头节点开始
}

public void DFSSelf(int x, boolean[] beTraversed) {
int y = 0;
while (y <= size - 1) {
if (matrix[x][y] != 0 && beTraversed[y] == false) { //遍历与当前节点有边的节点
beTraversed[y] = true;
System.out.print(vertexs[y] + " ");//遍历
DFSSelf(y, beTraversed);//递归进行深度遍历
}
y++;
}
}


邻接表(思路完全一样,只是获取关系节点的方式不一样):

public void DFS() {
boolean[] beTraversed = new boolean[size];
beTraversed[getPosition(vertexList[0].ch)] = true;
DFS(beTraversed, vertexList[0]);
}

/**
* 深度优先遍历
*
* @param beTraversed
* @param temp
*/
public void DFS(boolean[] beTraversed, Vertex temp) {
System.out.print(temp.ch + " ");
beTraversed[getPosition(temp.ch)] = true;
while (temp != null) {
if (beTraversed[getPosition(temp.ch)] == false) {
DFS(beTraversed, vertexList[getPosition(temp.ch)]);
}
temp = temp.next;
}
}


广度优先遍历
广度优先搜索算法(Breadth First Search),又称为”宽度优先搜索”或”横向优先搜索”,简称BFS。

它的思想是:从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使得“先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问,直至图中所有已被访问的顶点的邻接点都被访问到。如果此时图中尚有顶点未被访问,则需要另选一个未曾被访问过的顶点作为新的起始点,重复上述过程,直至图中所有顶点都被访问到为止。

换句话说,广度优先搜索遍历图的过程是以v为起点,由近至远,依次访问和v有路径相通且路径长度为1,2…的顶点。

代码实现(邻接矩阵):

public void BFSSelf() {
boolean[] beTraversed = new boolean[size];
beTraversed[0] = true;
System.out.print(vertexs[0] + " ");
BFSSelf(0, beTraversed, new LinkedList<>());
}

/**
* 广度优先搜索遍历
*
* @param x
* @param beTraversed
*/
public void BFSSelf(int x, boolean[] beTraversed, LinkedList<Character> list) {
int y = 0;
while (y <= size - 1) {
if (matrix[x][y] != 0 && beTraversed[y] == false) { //依次将与当前节点有联系的节点遍历,然后入队。
beTraversed[y] = true;
System.out.print(vertexs[y] + " ");
list.add(vertexs[y]);
}
y++;
}
if (!list.isEmpty()) { //出队进行递归操作
Character node = list.pop();
int pos = getPosition(node);
BFSSelf(pos, beTraversed, list);
}
}


邻接表

public void BFS(){
boolean[] beTraversed = new boolean[size];
beTraversed[getPosition(vertexList[0].ch)] = true;
System.out.print(vertexList[0].ch+" ");
int startPos = getPosition(vertexList[0].ch);
BFS(startPos,beTraversed);
}

/**
* 广度优先搜素遍历
* @param beTraversed
*/
public void BFS(int x,boolean[] beTraversed){
Vertex temp = vertexList[x];
LinkedList<Vertex> list = new LinkedList<>();
while(temp!=null){
if(beTraversed[getPosition(temp.ch)] == false){
System.out.print(temp.ch+" ");
beTraversed[getPosition(temp.ch)] = true;
list.add(vertexList[getPosition(temp.ch)]);
}
temp = temp.next;
}

while(!list.isEmpty()){
Vertex node = list.pop();
int pos = getPosition(node.ch);
BFS(pos,beTraversed);
}
}

25
26
27
28
29
30

————————————————
版权声明:本文为CSDN博主「谜一样的Coder」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liman65727/article/details/104311866

标签:ch,temp,boolean,beTraversed,访问,遍历
From: https://www.cnblogs.com/yaoyangding/p/17642428.html

相关文章

  • [转]如何在 JavaScript 中遍历对象
    原文地址:如何在JavaScript中遍历对象在JavaScript中,当你听到“循环”一词时,你可能会想到使用各种循环方法,例如 for 循环、forEach() 方法、map() 方法等等。但不幸的是,这些方法对于对象不起作用,因为对象是不可迭代的。这并不意味着我们不能循环遍历一个对象——只是我......
  • 链表的创建&遍历打印
    博客地址:https://www.cnblogs.com/zylyehuo/#-*-coding:utf-8-*-classNode:def__init__(self,item):self.item=itemself.next=None#头插法defcreate_linklist_head(li):head=Node(li[0])forelementinli[1:]:......
  • 代码随想录算法训练营第十八天| 513.找树左下角的值 112. 路径总和 106.从中序与
     找树左下角的值     卡哥建议:本地递归偏难,反而迭代简单属于模板题, 两种方法掌握一下   题目链接/文章讲解/视频讲解:https://programmercarl.com/0513.%E6%89%BE%E6%A0%91%E5%B7%A6%E4%B8%8B%E8%A7%92%E7%9A%84%E5%80%BC.html   做题思路:   题目说......
  • Python 如何自动遍历文件下所有的文件,然后再对每一个文件夹读取里面的csv文件
    Python如何自动遍历文件下所有的文件,然后再对每一个文件夹读取里面的csv文件:代码:importosimportcsv#设置要遍历的文件夹路径folder_path="your_folder_path"#遍历文件夹forroot,dirs,filesinos.walk(folder_path):#遍历当前文件夹下的所有文件for......
  • 遍历对象的属性和值
     前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷导语遍历所有的属性和值编辑 代码部分<!--*@......
  • Apache Flink目录遍历漏洞复现CVE-2020-17519
    ApacheFlink目录遍历漏洞复现CVE-2020-17519前置知识ApacheFlink:ApacheFlink是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。Flink能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。漏洞利用条件:ApacheFlink版本为1.11.0......
  • HashMap遍历方式
    HashMap是一个键值对的集合,我们不能通过简单的循环来遍历HashMap,所以我们一般通过以下两种方式来遍历HashMap,一种是通过KeySet集合来遍历,另一种是通过entry键值对对象来遍历。KeySet遍历HashMap通过keySet()方法获取HashMap的keySet集合遍历keySet集合,可以使用iterator迭代器......
  • 二叉树:自下而上,从左到右的层次遍历
    利用栈先进后出的特性,将出队元素依次进栈,然后依次出栈即可完成。#include<stdio.h>#include<stdlib.h>#defineMaxSize100//二叉树的结点类型typedefstructNode{intdata;structNode*lchild,*rchild;}TreeNode,*Tree;//队列的结点类型typedefstru......
  • 【剑指Offer】23、二叉搜索树的后序遍历序列
    【剑指Offer】23、二叉搜索树的后序遍历序列题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。解题思路:对于后续遍历序列,序列的最后一个值一定是树的根结点,而由二叉搜索树的性质......
  • [YsOI2023] 广度优先遍历 逆向输出路径(分层建树拓扑序. LCA)
    今天的模板测试是无向图上的广度优先遍历,【数据删除】马上写好了代码:1#include<cstdio>2#include<cstring>3#include<iostream>4#include<algorithm>5#include<vector>6#include<queue>7usingnamespacestd;8constintmaxn=100005;......