DFS vs BFS

  • 本质区别 : 优先扩展的节点不同
  • BFS : 优先扩展 最先(未扩展/访问) 的节点 ---- 队列
  • DFS : 有限扩展 最新 的的节点 ---

-例子: 二叉树的遍历


二叉树

构造二叉树

import networkx as nx
%matplotlib inline
binaryTree_connection = {
    0: [1, 5], 
    1: [0, 2,3], 
    2: [1], 
    3: [1,4], 
    4: [3],
    5: [0, 6,7], 
    6: [5],
    7: [5]
}
nx.draw(nx.Graph(binaryTree_connection,with_labels=True))
二叉树,节点信息未显示(有待解决)
def binaryTree_bfs(root,connection_graph):
   
    pathes = [root ]
    seen = set()
    seq=[]
    
    while pathes:
        froniter = pathes.pop(0)    
        ## pop() 默认取最后一个 我们优先扩展第一个,若每次把
        if froniter in seen: continue
        
        seq.append(froniter) # 遍历的顺序
        seen.add(froniter)   #已经访问过
        successors = connection_graph[froniter]
        pathes = pathes+successors  ## 把新的节点放入到最后
        
    return seq

广度优先,由于每次扩展的都是pathes里面的第一个节点,而每次把新产生的节点放在最后面,及优先扩展的先前的节点。

def binaryTree_dfs(root,connection_graph):
   
    pathes = [root ]
    seen = set()
    seq=[]
    
    while pathes:
        froniter = pathes.pop(0)
        if froniter in seen: continue  
        
        seq.append(froniter) # 遍历的顺序
        seen.add(froniter)   #已经访问过
        successors = connection_graph[froniter]
        pathes = successors+pathes  ##把新的节点放入到最前
        
    return seq

深度优先,由于每次扩展的都是pathes里面的第一个节点,而每次把新产生的节点放在最前面,即优先扩展的新节点

def draw(sep):
    sep=list(map(str,sep))    ## list中元素的类型转化  int -> str
    print('->'.join(sep))

draw(binaryTree_dfs(0 ,binaryTree_connection))
draw(binaryTree_bfs(0 ,binaryTree_connection))
打印输出

你可能感兴趣的:(DFS vs BFS)