Structurez votre arbre binaire. Chaque arbre binaire aura besoin d'une structure, même s'il n'a qu'une seule variable. Choisissez un nom, puis utilisez typedef pour le créer: typedef struct student_data STUDENT_DATA;
Définir la structure. Incluez deux pointeurs vers la même structure: struct student_data { int student_ID; int student_grade; STUDENT_DATA à gauche, à droite;};
Allouez un pointeur à cette structure de données, en l'initialisant à NULL, pour être la tête de l'arbre: STUDENT_DATA *students = NULL;
Allouez deux pointeurs temporaires à la structure de données: STUDENT_DATA nouvel étudiant, cur_student;
Utilisez malloc() pour créer un nouvel élément, en recherchant toujours une erreur: if ((new_student = malloc (sizeof (STUDENT_DATA))) == NULL) { abort(); }
Remplissez les champs du nouvel élément. Définissez ses champs gauche et droit sur NULL: new_student->student_ID = newID; new_student->student_size = newsize; new_student->left = NULL; new_student->right = NULL;
Considérez la variable de tête. Si la variable de tête est NULL, c'est le premier élément ajouté à l'arbre, alors définissez la variable de tête pour qu'elle pointe vers elle, et vous avez terminé: if (!students) { student = new_student; retourner; }
Gérez l'entrée en double si la nouvelle valeur et la valeur actuelle sont égales: if (newID == cur_student->student_ID) { abort(); }
Traiter des valeurs inégales. Si la nouvelle valeur est inférieure à la valeur actuelle, le nouvel élément passe à gauche. Ajoutez-le immédiatement s'il n'y a rien à gauche. Sinon, traversez à gauche et bouclez: if (newID < cur_student->student_ID) { if (cur_student->left == NULL) { cur_student->left = newstudent; retour 1; } cur_student = cur_student->left;
Faites la même chose à droite, sinon: } else { if (cur_student->right == NULL) { cur_student->right = newstudent; retour 1; } cur_student = cur_student->right; }}
Créez une variable temporaire pointant vers la structure de données: STUDENT_DATA *cur_student;
Parcourez les éléments en vérifiant la valeur souhaitée: while (cur_student) { if (cur_student->student_ID == 15) { return cur_student->student_grade; }
Branchez à gauche ou à droite, et bouclez, s'il n'est pas trouvé: if (cur_student->student_ID < 15) { cur_student = cur_student->right; } else { cur_student = cur_student->left; }
Voir si la boucle se termine. Si c'est le cas, cela signifie que vous n'avez jamais trouvé l'élément: } return 0;
Désallouez l'arborescence binaire à la fin de votre programme, car tous les systèmes d'exploitation ne le géreront pas automatiquement. Ceci est mieux fait en utilisant une fonction récursive: void deallocate_binary_tree (STUDENT_DATA *tree) {
Désallouez les sous-arbres gauche et droit de manière récursive: deallocate_binary_tree (tree->left); deallocate_binary_tree (arbre->droit);
La recherche et l'ajout d'arbres binaires peuvent également être effectués à l'aide de la récursivité. Ce sera beaucoup plus facile à écrire et à maintenir, mais un peu plus difficile à comprendre, jusqu'à ce que vous vous y habituiez. Il est courant de créer un arbre binaire qui ne contient que des pointeurs vers une deuxième structure de données C, souvent un tableau ou une liste chaînée, où résident les données réelles. Chaque arbre binaire est un index permettant de rechercher rapidement un seul champ des données de la liste.
La suppression d'un arbre binaire est un algorithme très compliqué en C, mais dans de nombreuses utilisations des arbres binaires, les éléments ne sont jamais supprimés.