深さ優先探索と幅優先探索の簡単な実装方法
深さ優先探索と幅優先探索は、実は簡単に実装することができます。
次のインターフェースを実装したクラスで例を見ていきます。
interface Node { public String getName(); public List<Node> getChildren(); }
深さ優先探索
深さ優先探索は以下の手順で実装できます。
- スタックを用意する
- スタックに最初の要素を入れる(push)
- スタックから要素を取り出す(pop)
- 要素に対して処理をする
- 要素の子供をスタックに入れる(push)
- スタックがカラになるまで3〜5を繰り返す
rootNodeから深さ優先探索でnameを出力するプログラムは次のようになります。
Deque<Node> stack = ArrayDeque<Node>(); stack.push(rootNode); while(!stack.isEmpty()) { Node node = stack.pop(); System.out.println(node.getName()); for(Node childNode : node.getChildren()) { stack.push(childNode); } }
幅優先探索
- キューを用意する
- キューに最初の要素を入れる(offer)
- キューから要素を取り出す(poll)
- 要素に対して処理をする
- 要素の子供をキューに入れる(offer)
- キューがカラになるまで3〜5を繰り返す
rootNodeから幅優先探索でnameを出力するプログラムは次のようになります。
Deque<Node> queue = ArrayDeque<Node>(); queue.offer(rootNode); while(!queue.isEmpty()) { Node node = queue.poll(); System.out.println(node.getName()); for(Node childNode : node.getChildren()) { queue.offer(childNode); } }