212 votes

Premier algorithme de recherche de profondeur non récursif

Je cherche un premier algorithme de recherche de profondeur non récursive pour un arbre non binaire. Toute aide est fortement appréciée.

371voto

biziclop Points 21446

DFS:

 list nodes_to_visit = {root};
while( nodes_to_visit isn't empty ) {
  currentnode = nodes_to_visit.first();
  nodes_to_visit.prepend( currentnode.children );
  //do something
}
 

BFS:

 list nodes_to_visit = {root};
while( nodes_to_visit isn't empty ) {
  currentnode = nodes_to_visit.first();
  nodes_to_visit.append( currentnode.children );
  //do something
}
 

La symétrie des deux est assez cool.

48voto

Gumbo Points 279147

Vous utiliseriez une pile contenant les nœuds non encore visités:

 stack.push(root)
while !stack.isEmpty() do
    node = stack.pop()
    for each node.childNodes do
        stack.push(stack)
    endfor
    // …
endwhile
 

35voto

aaz Points 3669

Si vous avez des pointeurs sur les nœuds parents, vous pouvez le faire sans mémoire supplémentaire.

 def dfs(root):
    node = root
    while True:
        visit(node)
        if node.first_child:
            node = node.first_child      # walk down
        else:
            while not node.next_sibling:
                if node is root:
                    return
                node = node.parent       # walk up ...
            node = node.next_sibling     # ... and right
 

Notez que si les nœuds enfants sont stockés sous forme de tableau plutôt que via des pointeurs frères, le frère suivant peut être trouvé comme suit:

 def next_sibling(node):
    try:
        i =    node.parent.child_nodes.index(node)
        return node.parent.child_nodes[i+1]
    except (IndexError, AttributeError):
        return None
 

5voto

corsiKa Points 39442

Utilisez une pile pour suivre vos nœuds

 Stack<Node> s;

s.prepend(tree.head);

while(!s.empty) {
    Node n = s.poll_front // gets first node

    // do something with q?

    for each child of n: s.prepend(child)

}
 

4voto

Chris Bennet Points 403

Bien que "utiliser une pile" puisse fonctionner comme une réponse à une question d'entrevue inventée, en réalité, il s'agit simplement de faire explicitement ce qu'un programme récursif fait en coulisse.

La récursivité utilise la pile intégrée aux programmes. Lorsque vous appelez une fonction, il pousse les arguments de la fonction sur la pile et, lorsque la fonction retourne, il le fait en vidant la pile du programme.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X