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

就是創建了一個圖想要進行深度遍歷和廣度遍歷但是第二個遍歷的時候只會出現一個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 = {}    # 添加此行
        ...
    
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板