[Kos-dev] Parcours d'arbre non récursif
Thomas Petazzoni
thomas.petazzoni at enix.org
Thu Sep 18 03:01:43 CEST 2003
Salut,
Ce soir un copain (Christophe Bliard) dinait à la maison, il s'est lancé
sur le problème. Il a pondu ça :
const tree_node_t *_splay_visit(const tree_node_t *node,
visitor_t visitor_in_order,
visitor_t visitor_reverse_order,
void *client_data)
{
tree_node_t *cur;
enum { COME_LEFT, COME_RIGHT, GO_DOWN, END } state;
if (node == NULL)
return node;
cur = node;
state = GO_DOWN;
do {
if ((cur->left != NULL) && (state == GO_DOWN)) {
state = GO_DOWN;
cur = cur->left;
}
else if ((cur->right != NULL) && (state == GO_DOWN || state ==
COME_LEFT)) { if (state == COME_LEFT || (cur->left == NULL && state
== GO_DOWN)) { printf("node key : %d\n", cur->key);
}
state = GO_DOWN;
cur = cur->right;
}
else {
if (state == GO_DOWN || (state == COME_LEFT && cur->right ==
NULL)) { printf ("node key : %d\n", cur->key);
}
if (cur->up == NULL) {
printf("plus de parent\n");
state = END;
}
else if (cur->key < cur->up->key) {
state = COME_LEFT;
cur = cur->up;
}
else {
state = COME_RIGHT;
cur = cur->up;
}
}
} while (state != END);
return node;
}
Et j'ai testé jusqu'à 100, ça affiche bien les nombres dans l'ordre ...
Quelqu'un pour vérifier ?
Thomas
--
PETAZZONI Thomas - thomas.petazzoni at enix.org - UIN : 34937744
http://www.enix.org/~thomas/
KOS: http://kos.enix.org/ - Lolut: http://lolut.utbm.info
Fingerprint : 0BE1 4CF3 CEA4 AC9D CC6E 1624 F653 CB30 98D3 F7A7
More information about the Kos-dev
mailing list