用邻接表实现图的存储并进行遍历
时间: 2023-03-03 17:09:26 浏览: 71
邻接表是一种常用的图存储结构,可以用链表来表示每个节点和它相邻节点之间的关系。具体实现步骤如下:
1. 定义节点类Node,其中包含节点的值val和一个指向相邻节点的链表head。
2. 定义图类Graph,其中包含一个节点数组和一个整数size表示节点数量,每个节点对应一个链表表示与其相邻的节点。
3. 实现Graph类的addEdge方法,用于向图中添加边。这个方法接受两个参数u和v,表示从节点u到节点v有一条边,首先在节点数组中找到u对应的节点,然后在其链表中添加一个指向v的节点。
4. 实现Graph类的DFS方法,用于进行深度优先遍历。这个方法接受一个起始节点参数start,首先将起始节点标记为已访问,然后遍历其链表中的每个相邻节点,对于未访问过的节点,递归调用DFS方法。
5. 实现Graph类的BFS方法,用于进行广度优先遍历。这个方法接受一个起始节点参数start,首先将起始节点入队,然后进入循环,每次从队列中取出一个节点,标记为已访问,遍历其链表中的每个相邻节点,对于未访问过的节点,将其入队。
下面是一个示例代码,其中Graph的实现使用了Python中的字典和集合数据结构:
```python
class Node:
def __init__(self, val):
self.val = val
self.head = None
class Graph:
def __init__(self):
self.nodes = {}
self.size = 0
def addEdge(self, u, v):
if u not in self.nodes:
self.nodes[u] = Node(u)
self.size += 1
if v not in self.nodes:
self.nodes[v] = Node(v)
self.size += 1
self.nodes[u].head = Node(v, self.nodes[u].head)
self.nodes[v].head = Node(u, self.nodes[v].head)
def DFS(self, start):
visited = set()
self._DFS(start, visited)
def _DFS(self, node, visited):
visited.add(node)
print(node)
for neighbor in self.nodes[node].head:
if neighbor.val not in visited:
self._DFS(neighbor.val, visited)
def BFS(self, start):
queue = [start]
visited = set()
while queue:
node = queue.pop(0)
visited.add(node)
print(node)
for neighbor in self.nodes[node].head:
if neighbor.val not in visited:
queue.append(neighbor.val)
visited.add(neighbor.val)
```