BFS,DFS python实现

队列 queue
特点:FIFO(first input ,first output),从队头删除元素,在队尾加入元素

queue=[]  #初始化队列----列表
#向空队列加入元素
queue.append("A")
queue.append("B")
queue.append("C")
print(queue)
#从队列弹出(删除)元素
queue.pop(0)  #从队列弹出队头元素
print(queue)
queue.pop()  #从队列弹出队末元素
print(queue)

结果:

['A', 'B', 'C']
['B', 'C']
['B']

堆栈 stack
特点:先进后出

stack=[]  #初始化栈---列表
#向栈中加入元素
stack.append("A")
stack.append("B")
stack.append("C")
print(stack)
#从栈中弹出(删除)元素
stack.pop()  #从栈中弹出(最上面)元素
print(stack)

结果:

['A', 'B', 'C']
['A', 'B']

图

BFS—广度优先搜索

graph={
    "A": ["B","C"],
    "B": ["A","C","D"],
    "C": ["A","B","D","E"],
    "D": ["B","C","E","F"],
    "E": ["C","D"],
    "F": ["D"]
}
def BFS(graph,s):
    """
    :param graph: 输入的图
    :param s: BFS的起始点
    :return: NONE
    """
    queue=[]  #用队列来保持层的顺序
    queue.append(s)   #先把起始点入队
    #创建一个空集合---visited:代表已经遍历过的点
    visited=set()    #set():创建一个空集合
    visited.add(s)   #把初始点放入集合中   ---   {'A'}

    #只要队列没空,就要一直遍历下去,直到将所有的点都遍历(pop)完
    while len(queue)>0:  #while queue
        vertex=queue.pop(0)     #把队头元素pop掉,pop出来的元素为vertex,eg:"A"
        nodes=graph[vertex]     #nodes是key--vertex  "A"对应的value--对应的列表["B","C"]
        for w in nodes:         #遍历nodes
            if w not in visited:  #如果nodes里的是没被遍历过的
                queue.append(w)     #那么就在队列后面加上
                visited.add(w)
        print(vertex)

BFS(graph,"A")

结果:

A
B
C
D
E
F

DFS—深度优先搜索

graph={
    "A": ["B","C"],
    "B": ["A","C","D"],
    "C": ["A","B","D","E"],
    "D": ["B","C","E","F"],
    "E": ["C","D"],
    "F": ["D"]
}
def DFS(graph,s):
    """
    :param graph: 输入的图
    :param s: BFS的起始点
    :return: NONE
    """
    stack=[]  #用队列来保持层的顺序
    stack.append(s)   #先把起始点入栈
    #创建一个空集合---visited:代表已经遍历过的点
    visited=set()    #set():创建一个空集合
    visited.add(s)   #把初始点放入集合中   ---   {'A'}

    #只要栈没空,就要一直遍历下去,直到将所有的点都遍历(pop)完
    while len(stack)>0:  #while stack
        vertex=stack.pop()     #把栈顶元素pop掉,pop出来的元素为vertex,eg:"A"
        nodes=graph[vertex]     #nodes是key--vertex  "A"对应的value--对应的列表["B","C"]
        for w in nodes:         #遍历nodes
            if w not in visited:  #如果nodes里的是没被遍历过的
                stack.append(w)     #那么就入栈
                visited.add(w)
        print(vertex)

DFS(graph,"A")

结果:

A
C
E
D
F
B
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值