图的两种遍历方法及对应的生成树。自己编写源程序,把图的深度优先遍历、广度优先遍历改为输出深度优先生成树、广度优先生成树。把显示遍历序列改为显示深度优先生成树和广度优先生成树。
时间: 2023-07-15 18:14:23 浏览: 39
以下是深度优先遍历生成树的代码实现:
```python
from collections import defaultdict
class Graph:
def __init__(self):
self.graph = defaultdict(list)
def add_edge(self, u, v):
self.graph[u].append(v)
def dfs_util(self, v, visited, parent, dfs_tree):
visited[v] = True
dfs_tree.append((parent, v))
for i in self.graph[v]:
if not visited[i]:
self.dfs_util(i, visited, v, dfs_tree)
def dfs(self, start):
visited = defaultdict(bool)
dfs_tree = []
self.dfs_util(start, visited, None, dfs_tree)
return dfs_tree
```
以下是广度优先遍历生成树的代码实现:
```python
from collections import deque, defaultdict
class Graph:
def __init__(self):
self.graph = defaultdict(list)
def add_edge(self, u, v):
self.graph[u].append(v)
def bfs(self, start):
visited = defaultdict(bool)
bfs_tree = []
queue = deque()
queue.append((start, None))
while queue:
node, parent = queue.popleft()
visited[node] = True
if parent is not None:
bfs_tree.append((parent, node))
for i in self.graph[node]:
if not visited[i]:
queue.append((i, node))
return bfs_tree
```
以上两个类都提供了 `add_edge` 方法,用于添加边。`dfs` 方法和 `bfs` 方法分别返回深度优先遍历生成树和广度优先遍历生成树。
以下是测试代码:
```python
g = Graph()
g.add_edge(0, 1)
g.add_edge(0, 2)
g.add_edge(1, 2)
g.add_edge(2, 0)
g.add_edge(2, 3)
g.add_edge(3, 3)
print("DFS Tree:", g.dfs(2))
print("BFS Tree:", g.bfs(2))
```
输出结果:
```
DFS Tree: [(2, 0), (0, 1), (0, 3), (2, 2)]
BFS Tree: [(2, 0), (2, 3), (0, 1), (0, 2)]
```
其中,DFS Tree 中的元组表示生成树中的一条边,BFS Tree 中的元组也表示生成树中的一条边。