深度優先搜尋(用棧實現)

2021-09-26 15:23:56 字數 1370 閱讀 9391

遞迴實現深度優先實際上就是棧

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把例子打了一遍。用廣搜寫了貪吃蛇自動吃果實...