可能なすべての DFS および BFS トラバーサルを実際に実行する明白な方法とは別に、次のアプローチを試すことができます。
ステップ 1. ルート A から始まる dfs トラバーサルでは、現在訪問しているノードの隣接リストを次のように変換します。まず、リストからノードの親を削除します。次に、adj リスト内の残りのノードの順列をすべて生成します。
したがって、ノード A からノード C にいる場合は、次のようにします。
C -> ADE transform into C -> DE transform into C -> [DE, ED]
ステップ 2. ステップ 1 の後、次の変換された adj リストが得られます。
A -> [CB, BC]
B -> []
C -> [DE, ED]
D -> []
E -> []
次に、(A,0) から始まる処理を開始します。ペアの最初の項目はトラバーサル パスで、2 番目の項目はインデックスです。2 つのキューがあるとします。BFS キューと DFS キュー。このペアを両方のキューに入れます。
ここで、最初に 1 つのキューが空になるまで次の手順を繰り返し、次にもう 1 つのキューに対して繰り返します。
最初のペアをキューから取り出します。(A,0) を取得します。ノード A は [BC, CB] にマップされます。したがって、2 つの新しいパス (ACB,1) と (ABC,1) を生成します。これらの新しいパスをキューに入れます。
これらの最初の 1 つをキューから取り出して (ACB,1) を取得します。インデックスは 1 なので、パス文字列の 2 番目の文字を調べます。これは C です。ノード C は [DE, ED] にマップされます。
- このパスの BFS の子は (ACBDE,2) と (ACBED,2) になり、子順列を追加することによって取得されます。
- このパスの DFS 子は (ACDEB,2) と (ACEDB,2) になり、パス文字列の C の直後に子順列を挿入することによって取得されます。
上記に基づいて、作業しているキューに従って新しいパスを生成し、それらをキューに入れます。したがって、BFS キューで作業している場合は、(ACBDE,2) と (ACBED,2) を入力します。キューの内容は、(ABC,1)、(ACBDE,2)、(ACBED,2) です。
(ABC,1) をキューからポップします。B には子がないため、(ABC,2) を生成します。キューを取得します: (ACBDE,2)、(ACBED,2)、(ABC,2) など。ある時点で、インデックスがパスに含まれていない一連のペアになってしまいます。たとえば、(ACBED,5) が得られた場合、これが完成したパスであることがわかります。