Kako napraviti binarno stablo u C

Strukturirajte svoje binarno stablo. Svako binarno stablo trebat će strukturu, čak i ako ima samo jednu varijablu. Odaberite naziv, a zatim upotrijebite typedef da ga kreirate: typedef struct student_data STUDENT_DATA;

Definirajte strukturu. Uključite dva pokazivača na istu strukturu: struct student_data { int student_ID; int učenik_razred; STUDENT_DATA lijevo, pravo;};

Dodijelite pokazivač na ovu strukturu podataka, inicijalizirajući je na NULL, da bude glava stabla: STUDENT_DATA *students = NULL;

Dodijelite dva privremena pokazivača na strukturu podataka: STUDENT_DATA novi student, cur_student;

Koristite malloc() za stvaranje novog elementa, uvijek provjeravajući grešku: if ((new_student = malloc (sizeof (STUDENT_DATA))) == NULL) { abort(); }

Popunite polja novog elementa. Postavite njegova lijevo i desno polje na NULL: new_student->student_ID = newID; novi_učenik->veličina_učenika = veličina vijesti; novi_učenik->lijevo = NULL; novi_učenik->desno = NULL;

Uzmite u obzir varijablu glave. Ako je varijabla head NULL, ovo je prvi element koji je dodan stablu, stoga postavite varijablu glave da pokazuje na nju i gotovi ste: if (!students) { students = new_student; povratak; }

Rukovati dupliciranim unosom ako su nova vrijednost i trenutna vrijednost jednake: if (newID == cur_student->student_ID) { abort(); }

Bavite se nejednakim vrijednostima. Ako je nova vrijednost manja od trenutne vrijednosti, novi element ide lijevo. Dodajte ga odmah ako nema ništa s lijeve strane. Inače, prijeđite lijevo i zakrenite petlju: if (noviID < cur_student->student_ID) { if (cur_student->left == NULL) { cur_student->left = newstudent; vratiti 1; } cur_student = cur_student->lijevo;

Učinite istu stvar s desne strane, inače: } else { if (cur_student->right == NULL) { cur_student->right = newstudent; vratiti 1; } cur_student = cur_student->desno; }}

Napravite privremenu varijablu koja ukazuje na strukturu podataka: STUDENT_DATA *cur_student;

Prođite kroz elemente, provjeravajući željenu vrijednost: while (cur_student) { if (cur_student->student_ID == 15) { return cur_student->student_grade; }

Grananje lijevo ili desno, i petlja, ako nije pronađena: if (cur_student->student_ID < 15) { cur_student = cur_student->right; } else { cur_student = cur_student->lijevo; }

Provjerite završava li petlja. Ako jest, to znači da nikada niste pronašli stavku: }return 0;

Odvojite binarno stablo kada vaš program završi, jer svi operacijski sustavi neće to rješavati automatski. To je najbolje učiniti pomoću rekurzivne funkcije: void deallocate_binary_tree (STUDENT_DATA *tree) {

Rekurzivno dealocate lijevo i desno podstablo: deallocate_binary_tree (stablo->left); delocate_binary_tree (stablo->desno);

Pretraživanje i dodavanje binarnim stablima također se može obaviti pomoću rekurzije. Ovo će biti puno lakše napisati i održavati, ali malo teže razumjeti dok se ne naviknete. Uobičajeno je stvoriti binarno stablo koje sadrži samo pokazivače na drugu C strukturu podataka, često niz ili povezanu listu, gdje se nalaze stvarni podaci. Svako binarno stablo je indeks za brzo pretraživanje jednog polja podataka popisa.

Brisanje iz binarnog stabla je vrlo kompliciran algoritam u C-u, ali u mnogim upotrebama binarnih stabala elementi se nikada ne brišu.