深度優先探索アルゴリズムを書いていますが、ツリーの右側から左に向かって検索しています。私は私のコードからそれがなぜそうしているのかを見ることができますが、左から右に検索するように変更するソリューションを考え出すことはできません。DFSアルゴリズムが右から左へ検索しています
public class DFS {
public LinkedList<Node> search(Node root, Node target) {
LinkedList<Node> open = new LinkedList<>();
LinkedList<Node> closed = new LinkedList<>();
open.addLast(root);
while (!open.isEmpty()) {
Node current = open.removeFirst();
if (current.equals(target)) {
closed.addLast(current);
return closed;
}
else {
ArrayList<Node> children = current.getChildren();
closed.addLast(current);
for (Node child : children) {
if (!open.contains(child) && !closed.contains(child)) {
open.addFirst(child);
}
}
}
}
return null;
}
}
closed
は、彼らが訪問された順に訪問したノードのリストです。
Node.getChildren()
は、追加された順にノードの子のArrayListを返します。あなたのDFSが本当にあなたの子供を逆転、またはその代わりaddLastのaddFirst、方向に依存している場合は
public class Node {
private ArrayList<Node> children;
private String name;
public Node(String name){
children = new ArrayList<Node>();
this.name = name;
}
public ArrayList<Node> getChildren(){
return new ArrayList<Node>(children);
}
public Node addChild(Node child){
children.add(child);
return child;
}
public void removeChild(Node child){
children.remove(child);
}
public String getName() {
return name;
}
public boolean equals(Node other){
return (this.getName().compareTo(other.getName())==0);
}
}
特に 'children'のループ中に' children.remove(child) 'をやっていますか? – user2357112
あなたはそれを指摘して以来、私はそれがどんな目的のために役立つのかわかりません!基本的には、そのノードを破棄したかっただけです。今すぐコードを編集します – KOB
@ user2357112修正しました。 – KOB