Bonsoir à tous !
J'ai un petit exercice d'algorithmique en cours qui me pose quelques soucis. L'objectif est de créer un parcours "binaire" à partir d'un arbre. Par exemple, imaginons l'arbre binaire suivant (on considère que l'arbre est forcément binaire) :
EDIT : mince, les espaces n'ont pas été pris en compte. Donc A est le noeud racine, B et C le fils gauche et droite respectivement, D et E les fils gauche et droite du noeud B respectivement, et F et G les fils gauche et droite du noeud C, respectivement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 D (100) B (10) - E (101) A (1) - F (110) C (11) - G (111)
L'algorithme (qui doit être en fait codé en C...) prend deux pointeurs vers des noeuds N1 et N2 (on assume pour simplifier que N2 est bien un sous-arbre de N1). En fait, en partant du noeud N1 dont la valeur binaire vaut 1, le noeud enfant de gauche effectue un décalage binaire vers la droite et le noeud enfant de droite un décalage binaire vers la droite + 1.
Si par exemple N1 est A, et N2 est D, le programme doit donc renvoyer le nombre binaire 100, et si N2 est F, il doit renvoyer 110.
L'algorithme doit être récursif.
J'ai essayé énormément de choses avec plusieurs types d'opérateurs binaires. Au début je m'étais orienté en parcourant l'arbre, et lorsqu'on arrive effectivement au noeud souhaité on renvoie 1, cette valeur étant soit décalée soit décalée + 1 s'il s'agit du noeud gauche ou droit, puis effectuer un OU binaire sur les valeurs des noeuds droite et gauche, mais cela ne fonctionne évidemment pas puisque je ne descends pas, mais je remonte...
J'en suis arrivé à des solutions comme celles-ci :
Mais qui ne fonctionnent que si on suit un chemin toujours dans la même direction (droite droite droite... ou gauche gauche gauche...).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 unsigned int GetPath (const Tree * s, const Tree * st) { unsigned int pathLeft = 1; unsigned int pathRight = 1; if ((s == NULL) || (st == NULL)) return 0; if (s == st) return 1; //pathLeft = (pathLeft << 1) * GetPath (s->sag, st); //pathRight = ((pathRight << 1) | 1) * GetPath (s->sad, st); pathLeft = GetPath (s->sag, st) << 1; pathRight = GetPath (s->sad, st) << 1 | 1; return (pathLeft | pathRight); }
J'avoue que je sèche un peu là (ayant BEAUCOUP de mal avec le récursif également...), j'ai essayé plein de solutions en utilisant des XOR, des OR... Mais je pense que la solution n'est pas là.
Partager