【发布时间】:2021-12-08 10:57:10
【问题描述】:
我正在尝试使用链表输出 BFS 树。但是,我在实现算法时遇到了麻烦。我被困在如何将链表图实现到算法中。我不太确定如何创建一个由假数组和真数组组成的矩阵,然后遍历它以根据选择的子节点找到假节点。我应该收到的输出是
0: 1 3
1: 2 4
3:
4:
代码:
class Node:
def __init__(self, value):
self.vertex = value
self.next = None
class AdjGraph:
def __init__(self, data):
self.data = data
self.graph = [None] * self.data
# Add edges
def addEdge(self, vertice, edge):
currNode = self.graph[vertice]
newNode = Node(edge)
if currNode == None:
self.graph[vertice] = newNode
return
while currNode != None:
if currNode.next == None:
currNode.next = newNode
break
currNode = currNode.next
# Implement BFS Graph
def bfs(self, s):
# Set discovered[s] = true, discovered[v] = false for all other v
discovered = [False] * self.graph
discovered[s] = True
# Intialize L[0] to consist of the single element s
layer = []
layer.append(s)
# Set the counter i = 0
i = 0
# Set the current BFS tree T = None
T = None
# While L[i] is not empty
while layer:
# Initialize an empty list L[i+1]
empty_list = layer[i+1]
print (s, end = " ")
# For each node u is an element of L[i]
for u in layer[i]:
# Consider each edge (u, v) incident to u
if discovered[v] == False:
# Set discovered[v] = true
discovered[v] = True
# Add edge (u, v) to the tree T
T.append
# Add v to the list L[i+1]
empty_list.append(v)
# Print the graph
def printGraph(self):
adj_list = "Adjacency List"
for i in range(self.data):
adj_list += "\n\nNode " + str(i) + ": "
temp = self.graph[i]
while temp:
adj_list += str(temp.vertex) + " "
temp = temp.next
print(adj_list)
g = AdjGraph(5)
g.addEdge(0, 1)
g.addEdge(0, 3)
g.addEdge(1, 0)
g.addEdge(1, 2)
g.addEdge(1, 3)
g.addEdge(1, 4)
g.addEdge(2, 1)
g.addEdge(2, 4)
g.addEdge(3, 0)
g.addEdge(3, 1)
g.addEdge(3, 4)
g.addEdge(4, 1)
g.addEdge(4, 2)
g.addEdge(4, 3)
g.bfs(0)
【问题讨论】:
-
你能修复缩进吗?您有可能用作方法的未缩进函数?
-
链表的用途是什么?我没看到。
-
对不起,我是新来的编程和这个网站。链表的目的是创建一个邻接表。链表为每个节点添加一条边。然后从邻接列表中创建 BFS 树。
-
什么是
v?它没有定义? -
BFS算法访问节点的顺序有什么要求吗?我的意思是,添加边的顺序与
addEdge对结果是否重要?
标签: python linked-list breadth-first-search