python3.x - 關於Python圖遍歷的操作
三叔
三叔 2017-06-15 09:22:00
0
1
789

就是創建了一個圖想要進行深度遍歷和廣度遍歷但是第二個遍歷的時候只會出現一個data 感覺是因為自己之前的那個遍歷把self.visited[node] = True 的緣故但是又不知道怎麼進行修改,求各位指教

以下是程式碼:

class Graph(object): def __init__(self, *args, **kwargs): self.node_neighbors = {} self.visited = {} def add_nodes(self,nodelist): for node in nodelist: self.add_node(node) def add_node(self,node): if node not in self.nodes(): self.node_neighbors[node] = [] def add_edge(self,edge): u, v = edge if(v not in self.node_neighbors[u]) and (u not in self.node_neighbors[v]): self.node_neighbors[u].append(u) if(u!=v): self.node_neighbors[v].append(u) def nodes(self): return self.node_neighbors.keys() def depth_first_search(self, root=None): order = [] def dfs(node): self.visited[node] = True order.append(node) for n in self.node_neighbors[node]: if not n in self.visited: dfs(n) if root: dfs(root) for node in self.nodes(): if not node in self.visited: dfs(node) print(order) return order def breadtg_frist_search(self, root = None): queue = [] order = [] def bfs(): while len(queue) > 0: node = queue.pop() self.visited[node] = True for n in self.node_neighbors[node]: if (not n in self.visited) and (not n in queue): queue.append(n) order.append(n) if root: queue.append(root) order.append(root) bfs() for node in self.nodes(): if not node in self.visited: queue.append(node) order.append(node) bfs() print(order) return order if __name__ == '__main__': g = Graph() g.add_nodes([i+1 for i in range(10)]) g.add_edge((1, 2)) g.add_edge((1, 3)) g.add_edge((2, 4)) g.add_edge((2, 5)) g.add_edge((4, 8)) g.add_edge((5, 8)) g.add_edge((5, 9)) g.add_edge((3, 6)) g.add_edge((3, 7)) g.add_edge((7, 10)) g.add_edge((9, 10)) print('nodes:', g.nodes()) order = g.depth_first_search(1) order = g.breadtg_frist_search(1)

然後遍歷出來的結果是

nodes: dict_keys([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] [1]
三叔
三叔

全部回覆 (1)
学霸

樓主,是self.visited的問題,第一次深度搜尋調用self.visted時,已經把所有節點變為true,第二次廣度搜尋使用第一次深度搜尋結果, 改為如下即可:

class Graph(object): def __init__(self, *args, **kwargs): self.node_neighbors = {} # self.visited = {} # 删除此行 ... def depth_first_search(self, root=None): self.visited = {} # 添加此行 ... def breadtg_frist_search(self, root = None): self.visited = {} # 添加此行 ...
    最新下載
    更多>
    網站特效
    網站源碼
    網站素材
    前端模板
    關於我們 免責聲明 Sitemap
    PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!