Beaucoup ont probablement essayé de trouver la construction d'un arbre de type général, mais le moteur de recherche ne trouvait que des arbres binaires... Arbre binaire de recherche, parcours d'arbre binaire et de nombreux autres algorithmes.
Oui, en effet, l'arbre de type général n'est utilisé nulle part, le parcours est lent, et les cas d'utilisation sont limités.
Ainsi, je me suis posé cette question et je vais maintenant expliquer comment construire un arbre de ce type. Idéalement, la structure d'un arbre de type général devrait contenir trois variables :
- un pointeur vers le fils aßné
- un pointeur vers le frĂšre
- les données que vous souhaitez stocker
struct Tnode {
int key;
struct Tnode *son;
struct Tnode *brother;
};
typedef struct Tnode Node;
Déclarons un pointeur vers la racine :
Node *tree = NULL;Nous devons convenir Ă l'avance de la maniĂšre d'insĂ©rer des nĆuds, car ce n'est pas un arbre binaire, et chaque nĆud peut avoir un nombre illimitĂ© de fils.
- + 2 (ou +ssbb 2) â insertion dans l'arbre (pour un arbre de type gĂ©nĂ©ral, le chemin est spĂ©cifiĂ© par une chaĂźne oĂč r crĂ©e la racine, s â passe au fils aĂźnĂ©, b â passe au frĂšre);
Prenons un exemple :
+r 1
+ 2
+ 3
+ 3
+s 5
+sb 6
+sb 7
Le résultat sera un arbre comme celui-ci :
1
2
5
3
6
7
3
Commençons par crĂ©er une fonction qui ajoute un nĆud, c'est-Ă -dire qui alloue de la mĂ©moire pour le nĆud et renvoie un pointeur vers ce nĆud (initialement non liĂ© Ă quoi que ce soit).
Node *create_tree(int v) {
Node *Tree = (Node *) malloc(sizeof(Node));
Tree->key = v;
// nous remettons Ă zĂ©ro les pointeurs vers les frĂšres et les fils, un nĆud indĂ©pendant qui stocke la valeur
Tree->son = NULL;
Tree->brother = NULL;
return Tree;
}
Nous devons Ă©galement crĂ©er une fonction qui traite la chaĂźne de chemin (+bsâŠ). Ă chaque fois, nous commençons le parcours Ă partir de la racine, si elle n'est pas créée, nous affichons NULL (nous ne pouvons rien faire). S'il n'y a pas de nĆud, nous devons le crĂ©er. Nous appelons la fonction de crĂ©ation d'arbre et obtenons un pointeur vers la racine.
à noter, Node ** tree passe la structure et ne la copie pas. Cela nous donne la possibilité de modifier, ce qui n'est pas possible avec la déclaration Node *tree.
En rĂ©sumĂ©, nous devons trouver un pointeur vers le nĆud auquel nous devons ajouter un fils :
Node* add_node(Node **tree, const char *a) {
Node* t = *tree;
int value;
scanf("%d", &value);
int i = 0;
while (a[++i] != ' ') {
if (a[i] == 'r') {
*tree = create_tree(value); // création de la racine
t = *tree;
return *tree;
}
if (a[i] == 's') {
if (t = to_son(t)) // fonction qui renvoie un pointeur sur le fils
continue;
return NULL; // sinon NULL
}
if (a[i] == 'b') {
if (t = to_brother(t)) // renvoie un pointeur sur le frĂšre t
continue;
return NULL;
}
}
if (t->son != NULL) {
t = last_son(t); // nous avons atteint le sommet que nous voulions
// et maintenant allons au dernier de ses fils,
// pour ajouter Ă la fin de la liste
t->brother = create_tree(value);
return t->brother;
}
else {// s'il n'y a pas de fils, nous allons le créer
t->son = create_tree(value);
return t->son;
}
}
Ainsi, nous construisons l'arbre.
P.S. C'est mon premier article, donc je vous prie de ne pas ĂȘtre trop sĂ©vĂšres.
Source : habr.com
