Python之 DFS(深度优先遍历) 和 BFS:(广度优先遍历)

BFS (Breadth First Search)   

广度优先的[递归]伪代码如下:

        把start节点push入队列;

        while(队列不为空) {

            把队列首节点pop出队列;

            对节点进行相关处理或者判断;

            while(此节点有下一个相关节点){

                把相关节点push入对列;

            }

        }

def bfs(self,root): # 传入树的根节点
    quene=[] 
    q.append(root) 
    while len(q)!=0:
        every_layer=[]
        length=len(q)
        for i in range(length):
            r=q.pop(0) 
            if not r.left is None: 
               q.append(r.left)
            if not r.right is None:
               q.append(r.right)
            every_layer.append(r.val)
        print every_layer
        print ' '
        result.append(every_layer)

 

DFS (Deep First Search)

        find(节点){
 
            if(此结点已经遍历 || 此节点在图外 || 节点不满足要求) return;
 
            if(找到了end节点) 输出结果 ; return;
 
            标记此节点,表示已经遍历过了;

            while(存在下一个相邻节点) find(下一个节点);
 
        }

def iter_dfs(G,s):
    S,Q = set(),[]   #访问集合和队列
    Q.append(s)      #我们计划访问s
    while Q:
        u = Q.pop()  #使程序进展
        if u in S:continue  #是否访问过?跳过
        S.add(u)
        Q.extend(G(u))     
        yield u            #u就是我们要的

 利用栈实现

def dfs(node):
    if node is None:
        return
    nodeSet = set()
    stack = []
    print(node.value)
    nodeSet.add(node)
    stack.append(node)
    while len(stack)>0:
        cur = stack.pop()
        for next in cur.nexts:
            if next not in nodeSet:
                stack.append(cur)
                stack.append(next)
                set.add(next)
                print(next.value)
                break

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值