图的遍历方法

所谓遍历,就是把图中的顶点访问且只访问一次。为了使每个顶点只访问一次,我们需要设置一个标志数组visited。

图的遍历有两种方法: 1-深度优先搜索; 2-广度优先搜索


1-深度优先搜索

  指按照深度方向搜索,它类似于数的先根遍历。

思路为:

a,从图中的某一顶点V0出发,先遍历V0.

b,找出刚访问过的顶点的第一个未访问过邻接顶点,然后访问该顶点。以该顶点为新的顶点,重复此步骤,直到刚访问过的顶点没有未被访问过的邻接顶点为止。

c,返回前一个访问过的且任有未被访问过的邻接点的顶点,找出该顶点的下一个未被访问过的邻接点,访问该顶点,然后执行步骤b。

如下图对应的深度优先遍历序列为:ABCFDGEHI


以下为邻接矩阵和邻接表对应的深度优先遍历方法:

#define MAX_VERTEX_NUM 20//最大支持的顶点个数
int visited[MAX_VERTEX_NUM];//访问标志数组

//邻接矩阵对应的深度优先遍历算法
void TraverseGraph(Graph g)
{
	for(int i=1;i<=g.vexnum;i++){
		visited[i] = 0;//设置0表示未访问
	}
	for(i=1;i<=g.vexnum;i++){//循环调用DepthFirstSearch(g,i);若图为联通图,该循环只执行一次
		if(!visited[i])
			DepthFirstSearch(g,i);
	}
}

/*邻接矩阵对应的DepthFirstSearch(g,i)函数*/
void DepthFristSearch(AdjMatrix g, int v0)
{
	visit();//具体的操作根据实际而定
	visited[v0]=1;//该顶点已访问
	for(int vj=0;vj<n;vj++){
		if(!visited[vj]&&g.arcs[v0][[vj].adj==1)
			DepthFirstSearch(g,vj);
	}
}

//邻接表对应的优先深度遍历算法
void DepthFirstSearch(AdjList g,int vo)
{
	visit(v0);//根据需要改变
	visited[v0]=1;
	p=g.vertex[v0].firstarc;
	while(p!=NULL){
		if(!visited[p->adjvex]){
			DepthFirstSearch(g,p->adjvex);
			p=p->nextarc;
		}
	}
}	

2-广度优先搜索
   思路:

a,从图中的某个顶点v0出发,首先遍历v0.

b,一次访问v0的各个未被访问的邻接顶点。

c,分别从这些邻接点出发,依次访问它们的各个未被访问的邻接点。

如上图的遍历序列为:ABDECGFHI

下面为广度优先遍历V0所在连通子图方法:

void BreadthFirstSearch(Graph g,int v0)
{
	visit(v0);//根据需要改变为具体操作
	visited[v0] = 1;
	InitQueue(&Q);//初始化空队列
	EnterQueue(&Q,v0);
	while(!Empty(Q)){
		DeleteQueue(&Q,&v);//队首元素出队
		w = FirstAdjvex(g,v);
		while(w!=-1){
			if(!visited[w]){
				visit(w);
				visited[w]=1;
				EnterQueue(&Q,w);
			}
			w=NextAdjVertex(g,v,w);
		}
	}
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 哈希映射遍历的主要方法有两种:键值对遍历和串联遍历。键值对遍历是按照键值对的方式进行遍历,每次取出一个键值对,并且可以按照指定的顺序进行遍历。串联遍历是按照存储在哈希表中的每一条链接依次进行遍历,一般情况下没有指定的遍历顺序。 ### 回答2: HashMap是Java中常用的集合类之一,用于存储键值对。在遍历HashMap时,有几种常见的方法可以选择。 方法一:使用keySet()方法遍历键 通过调用HashMap的keySet()方法可以获取到一个包含所有键的Set集合。然后可以使用迭代器或者foreach循环遍历这个集合,再通过get()方法获取每个键对应的值。 方法二:使用values()方法遍历值 通过调用HashMap的values()方法可以获取到一个包含所有值的Collection集合。同样地,可以使用迭代器或者foreach循环遍历这个集合,直接获取每个值。 方法三:使用entrySet()方法遍历键值对 通过调用HashMap的entrySet()方法可以获取到一个包含所有键值对的Set集合。这个集合的元素是Map.Entry对象,可以调用getKey()方法获取键,调用getValue()方法获取值。 这些遍历方法各有优劣。对于只需要遍历值的情况,方法二是最简单方便的;对于需要同时获取键和值的情况,方法三是最合适的选择;而方法一则适用于只需要遍历键的情况,但是需要使用get()方法获取对应值。 最后,需要注意的是HashMap是无序的,遍历的结果并不保证按照插入的顺序或者排序的方式。如果需要按照顺序遍历,可以考虑使用LinkedHashMap。 ### 回答3: HashMap是Java中的一种数据结构,它用于存储键值对(Key-Value)的映射关系。在使用HashMap时,需要遍历其中的元素,可以使用多种方法来实现。 1. 使用迭代器遍历:可以通过HashMap的`entrySet()`方法获得所有Entry对象的Set集合,然后使用迭代器进行遍历。代码如下: ```java HashMap<String, Integer> hashMap = new HashMap<>(); // 添加键值对 hashMap.put("A", 1); hashMap.put("B", 2); hashMap.put("C", 3); Iterator<Map.Entry<String, Integer>> iterator = hashMap.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<String, Integer> entry = iterator.next(); String key = entry.getKey(); Integer value = entry.getValue(); System.out.println("Key: " + key + ", Value: " + value); } ``` 2. 使用for-each循环遍历:可以直接使用`entrySet()`方法返回的Set集合,使用for-each循环遍历。代码如下: ```java HashMap<String, Integer> hashMap = new HashMap<>(); // 添加键值对 hashMap.put("A", 1); hashMap.put("B", 2); hashMap.put("C", 3); for (Map.Entry<String, Integer> entry : hashMap.entrySet()) { String key = entry.getKey(); Integer value = entry.getValue(); System.out.println("Key: " + key + ", Value: " + value); } ``` 3. 遍历键集合或值集合:可以使用`keySet()`方法获取所有的键的Set集合,或使用`values()`方法获取所有的值的Collection集合,然后遍历它们。代码如下: ```java HashMap<String, Integer> hashMap = new HashMap<>(); // 添加键值对 hashMap.put("A", 1); hashMap.put("B", 2); hashMap.put("C", 3); // 遍历键集合 for (String key : hashMap.keySet()) { Integer value = hashMap.get(key); System.out.println("Key: " + key + ", Value: " + value); } // 遍历值集合 for (Integer value : hashMap.values()) { System.out.println("Value: " + value); } ``` 通过以上三种遍历方法,可以方便地遍历HashMap中的所有元素,并对其进行相应的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值