Hier ist ein Java-Code für Breiten first travel:Rekursive Breite-erste Reisefunktion in Java oder C++?
void breadthFirstNonRecursive(){
Queue<Node> queue = new java.util.LinkedList<Node>();
queue.offer(root);
while(!queue.isEmpty()){
Node node = queue.poll();
visit(node);
if (node.left != null)
queue.offer(node.left);
if (node.right != null)
queue.offer(node.right);
}
}
Ist es möglich, eine rekursive Funktion zu schreiben, das gleiche zu tun?
Zuerst dachte ich, das einfach sein würde, so kam ich mit diesem aus:
void breadthFirstRecursive(){
Queue<Node> q = new LinkedList<Node>();
breadthFirst(root, q);
}
void breadthFirst(Node node, Queue<Node> q){
if (node == null) return;
q.offer(node);
Node n = q.poll();
visit(n);
if (n.left != null)
breadthFirst(n.left, q);
if (n.right != null)
breadthFirst(n.right, q);
}
Dann fand ich es nicht funktioniert. Es ist tatsächlich das Gleiche wie das:
void preOrder(Node node) {
if (node == null) return;
visit(node);
preOrder(node.left);
preOrder(node.right);
}
Hat jemand darüber nachgedacht?
übrigens rekursiv tun BFS würde wahrscheinlich dazu führen, dass Stapel in der Größe des Zustandsraums wachsen. Wenn sich Ihre Lösung in der Tiefe d befindet, wäre der zum Finden der Lösung erforderliche Stapelspeicherplatz, wobei b der Verzweigungsfaktor ist. – Eric