[予約]深さ優先探索アルゴリズム

:より転載https://blog.csdn.net/saltriver/article/category/6506969

深さ優先探索(DFS、深さ優先探索は)描画およびツリーのトラバーサルアルゴリズムです。19世紀初頭には、迷路を解くために使用されました。

次のツリーのため、DFSの方法は、まず、ルートノードから始まり左優先ポイントの左ブランチ及び右ブランチを想定(ノードの順序は1,2,3,4,5,6,7,8で検索します分岐)。
ここで説明する絵を書きます
:DFS BFSの実装は、以下のように同様の、しかし単に置き換えキュースタック、特性LIFO(最後の入力第一の出力)Aを有するLIFOスタックと比較して、DFSステップがあることを指摘しておかなければ
1を、出発点は、スタックに;
スタックは、これまでに空になるまで2、3は、以下の手順を繰り返します。

  • スタック内のスタックの最上位からのアクセスポイント。
  • 特定し、この点に隣接ポイントは、横断標識し、その後、スタックのすべてを入れていません。
  • この時点ではまだ隣人、スタック内のこの時点からポップアップを横断していない場合。

下面结合一个图(graph)的实例,说明DFS的工作过程和原理:
(1)将起始节点1放入栈stack中,标记为已遍历。
ここで説明する絵を書きます
(2)从stack中访问栈顶的节点1,找出与节点1邻接的节点,有2,9两个节点,我们可以选择其中任何一个,选择规则可以人为设定,这里假设按照节点数字顺序由小到大选择,选中的是2,标记为已遍历,然后放入stack中。
ここで説明する絵を書きます
(3)从stack中取出栈顶的节点2,找出与节点2邻接的节点,有1,3,5三个节点,节点1已遍历过,排除;3,5中按照预定的规则选中的是3,标记为已遍历,然后放入stack中。
ここで説明する絵を書きます
(4)从stack中取出栈顶的节点3,找出与节点3邻接的节点,有2,4两个节点,节点2已遍历过,排除;选中的是节点4,标记为已遍历,然后放入stack中。
ここで説明する絵を書きます
(5)从stack中取出栈顶的节点4,找出与节点4邻接的节点,有3,5,6三个节点,节点3已遍历过,排除;选中的是节点5,标记为已遍历,然后放入stack中。
ここで説明する絵を書きます
(6)从stack中取出栈顶的节点5,找出与节点5邻接的节点,有2,4两个节点,节点2,4都已遍历过,因此节点5没有尚未遍历的邻接点,则将此点从stack中弹出。
ここで説明する絵を書きます
(7)当前stack栈顶的节点是4,找出与节点4邻接的节点,有3,5,6三个节点,节点3,5都已遍历过,排除;选中的是节点6,标记为已遍历,然后放入stack中。
ここで説明する絵を書きます
(8)当前stack栈顶的节点是6,找出与节点6邻接的节点,有4,7,8三个节点,4已遍历,按照规则选中的是7,标记为已遍历,然后放入stack中。
ここで説明する絵を書きます
(9)スタックの現在のノードスタックトップの隣接ノードのみのノード6を見つけるために、7、および7で、横断されているので、全く隣人はまだ、ポップのスタックからノード7を横断しません。
ここで説明する絵を書きます
(10)現在のノードが積層体6のスタックの最上位であり、隣接ノード6を識別するために、ノードは、ノードがスタックに配置され、したがって7,8,7、8を横断してきました。
ここで説明する絵を書きます
(11)現在のノードがノードを識別するために、隣接するスタック8,8のスタックの最上位で、ノード1,6,9,1,6は、トラバースされたスタックにノード9においてそれほど。
ここで説明する絵を書きます
(12)スタック9の現在のノードスタックのトップがまだトラバースされていない隣接点は、ノード9がポップアップ表示され、というように、スタック内の残りのノードはまだトラバース隣接点8,6,4,3,2,1ありません、これは、ポップアップ表示されます、そして最後にスタックが空です。
(13)DFSトラバーサル完了。

おすすめ

転載: www.cnblogs.com/toooney/p/10991629.html