Štruktúrujte svoj binárny strom. Každý binárny strom bude potrebovať štruktúru, aj keď má iba jednu premennú. Vyberte názov a potom ho vytvorte pomocou typedef: typedef struct student_data STUDENT_DATA;
Definujte štruktúru. Zahrňte dva ukazovatele na rovnakú štruktúru: struct student_data { int student_ID; int student_grade; STUDENT_DATA vľavo, správny;};
Prideľte ukazovateľ tejto dátovej štruktúre, inicializujte ju na NULL, aby bola hlavou stromu: STUDENT_DATA *students = NULL;
Prideľte dva dočasné ukazovatele na dátovú štruktúru: STUDENT_DATA nový_študent, cur_student;
Na vytvorenie nového prvku použite malloc() a vždy skontrolujte, či nedošlo k chybe: if ((new_student = malloc (sizeof (STUDENT_DATA))) == NULL) { abort(); }
Vyplňte polia nového prvku. Nastavte jeho ľavé a pravé pole na NULL: new_student->student_ID = newID; new_student->student_size = veľkosť noviniek; new_student->left = NULL; novy_student->vpravo = NULL;
Zvážte premennú hlavy. Ak je premenná head NULL, toto je prvý prvok pridaný do stromu, takže nastavte premennú head tak, aby naň ukazovala, a máte hotovo: if (!students) { students = new_student; návrat; }
Spracujte duplicitný záznam, ak sa nová hodnota a aktuálna hodnota rovnajú: if (newID == cur_student->student_ID) { abort(); }
Vyrovnajte sa s nerovnakými hodnotami. Ak je nová hodnota menšia ako aktuálna hodnota, nový prvok sa presunie vľavo. Okamžite ho pridajte, ak vľavo nič nie je. V opačnom prípade prejdite doľava a zacyklte: if (novéID < cur_student->ID_studenta) { if (cur_student->left == NULL) { cur_student->left = newstudent; návrat 1; } cur_student = cur_student->left;
Urobte to isté na pravej strane, inak: } else { if (cur_student->right == NULL) { cur_student->right = newstudent; návrat 1; } cur_student = cur_student->right; }}
Vytvorte dočasnú premennú ukazujúcu na dátovú štruktúru: STUDENT_DATA *cur_student;
Prejdite prvky a skontrolujte požadovanú hodnotu: while (cur_student) { if (cur_student->student_ID == 15) { return cur_student->student_grade; }
Rozvetvte vľavo alebo vpravo a zacyklte, ak sa nenájde: if (cur_student->student_ID < 15) { cur_student = cur_student->right; } else { cur_student = cur_student->left; }
Pozrite sa, či slučka končí. Ak áno, znamená to, že ste položku nikdy nenašli: }return 0;
Udeľte pridelenie binárneho stromu, keď váš program skončí, pretože nie všetky operačné systémy to zvládnu automaticky. Najlepšie je to urobiť pomocou rekurzívnej funkcie: void deallocate_binary_tree (STUDENT_DATA *strom) {
Dealokujte ľavý a pravý podstrom rekurzívne: deallocate_binary_tree (strom->left); deallocate_binary_tree (strom->vpravo);
Vyhľadávanie a pridávanie do binárnych stromov je možné vykonať aj pomocou rekurzie. Bude sa to oveľa ľahšie písať a udržiavať, ale bude to trochu ťažšie pochopiť, kým si na to nezvyknete. Je bežné vytvoriť binárny strom, ktorý obsahuje iba ukazovatele na druhú dátovú štruktúru C, často pole alebo prepojený zoznam, kde sa nachádzajú skutočné údaje. Každý binárny strom je index na rýchle vyhľadávanie v jednom poli údajov zoznamu.
Odstránenie z binárneho stromu je v C veľmi komplikovaný algoritmus, ale pri mnohých použitiach binárnych stromov sa prvky nikdy neodstránia.