- 本质区别 : 优先扩展的节点不同
- 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))

打印输出