遞迴實現深度優先實際上就是棧
graph =
graph[
"you"]=
["alice"
,"bob"
,"claire"
]graph[
"bob"]=
["anuj"
,"peggy"
]graph[
"alice"]=
["peggy"
]graph[
"claire"]=
["thom"
,"jonny"
]graph[
"anuj"]=
graph[
"peggy"]=
graph[
"thom"]=
graph[
"jonny"]=
#棧的思想實現深度優先
defdfs
(graph,start)
: stack=
[[start,0]
] searched=
set(
) searched.add(start)
res=
[start]
while stack:
#stack[-1]表示從棧的最後乙個表示的節點開始
(node,next_child_id)
=stack[-1
]#print node ,next_child_id
#當到達樹的最後一層時next_child_id = len(graph[node])=0
if(node not
in graph)
or(next_child_id>=
len(graph[node]))
: stack.pop(
)continue
next_child=graph[node]
[next_child_id]
#棧的最後乙個表示的節點的next_child_id+1
stack[-1
][1]
=stack[-1
][1]
+1if next_child in searched:
continue
searched.add(next_child)
#將當前節點的孩子壓入棧
[next_child,0]
)print res
dfs(graph,
'you'
)
輸出為
['you', 'alice', 'peggy', 'bob', 'anuj', 'claire', 'thom', 'jonny']
棧和深度優先搜尋(DFS)
如上圖 使用 dfs 找出從根結點 a 到目標結點 g 的路徑 步驟如下 1 從根節點a開始,選擇節點b的路徑,繼續深入,直到e,無法更進一步深入,此時棧內容為abe 依次退棧eb 2 回溯到a節點,選擇第二條路徑c入棧,e入棧,但e已被訪問過,彈出e,回溯到c節點 選擇另一條路徑 f入棧,g入棧。...
深度優先搜尋DFS C 實現
使用鄰接矩陣 棧的形式實現深度優先搜尋,棧中儲存訪問過的節點,後進先出的結構可以讓他回退搜尋未訪問過的節點。dfs,使用 鄰接矩陣 棧 實現 include include using namespace std define max verts 20 class vertex public boo...
js實現廣度優先搜尋和深度優先搜尋
最近在學習演算法,看了 演算法,但是感覺寫的太簡單,理論比較多,實現比較和例子比較少,看完後,又接著看了 啊哈!演算法 這個感覺例子比較多,也比較適合我這種演算法入門的讀者。書上的例子一一打了一遍,因為作者是用c寫的,而我是沒接觸過c,用了自己比較熟悉的js把例子打了一遍。用廣搜寫了貪吃蛇自動吃果實...