广度遍历和深度遍历 只差一个操作。 就是用列表 存储访问过的 节点广度遍历每次从列表前取一个元素(队列的方式), 深度遍历每次从列表后取一个元素(栈的方式)

class Graph(object):
    '''无向图, 邻接表'''
    def __init__(self, family=None):
        self.node_neighbors = {}

    @property
    def nodes(self):
        '''所有顶点'''
        return self.node_neighbors.keys()

    def neighbors(self, u):
        '''顶点u的所有邻接点'''
        return self.node_neighbors.get(u, set())

    def add_node(self, node):
        '''添加一个顶点'''
        if not node in self.nodes:
            self.node_neighbors[node] = set()

    def add_nodes(self, nodelist):
        '''添加多个顶点'''
        for node in nodelist:
            self.add_node(node)

    def add_edge(self, edge):
        '''添加一条边'''
        u, v = edge
        if u not in self.nodes or v  not in self.nodes:
            print 'error has no node %s or %s .' % (str(u), str(v))
        self.node_neighbors.get(u).add(v)
        self.node_neighbors.get(v).add(u)

    def add_edges(self, edges):
        '''添加多条边'''
        for u, v in edges:
            self.add_edge((u,v))

    def depth_first_search(self, root=None):
        '''深度优先遍历
        用stack存储遍历过的顶点,先进后出
        '''
        stack = []
        visited = set()
        def dfs():
            while stack:
                node = stack.pop()
                visited.add(node)
                print node,
                for n in self.neighbors(node):
                    if  n not in visited:
                        stack.append(n)
                        visited.add(node)
            print '--',

        if root:
            stack.append(root)
            dfs()

        for node in self.nodes:
            if node not in visited:
                stack.append(node)
                dfs()
        print

    def breadth_first_search(self, root=None):
        '''广度优先遍历
        用queue存储遍历的过的顶点, 先进先出
        '''
        queue = []
        visited = set()
        def bfs():
            while queue:
                node = queue.pop(0)
                visited.add(node)
                print node,
                for n in self.neighbors(node):
                    if n not in visited:
                        queue.append(n)
                        visited.add(node)
            print '--',

        if root:
            queue.append(root)
            bfs()

        for node in self.nodes:
            if node not in visited:
                queue.append(node)
                bfs()
        print

    @classmethod
    def test(cls):
        g = cls()
        g.add_nodes([i for i in range(1,9)])
        print "nodes:", g.nodes

        g.add_edge((1, 2))
        g.add_edge((1, 3))
        g.add_edge((2, 3))
        g.add_edge((6, 2))
        g.add_edge((4, 5))
        g.add_edge((6, 7))
        g.add_edge((3, 5))

        print '广度遍历:',
        g.breadth_first_search(1)
        print '深度遍历:',
        g.depth_first_search(1)

Graph.test()

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值