Hogyan készítsünk bináris fát C-ben

Strukturálja a bináris fát. Minden bináris fának szüksége lesz egy szerkezetre, még akkor is, ha csak egy változója van. Válasszon egy nevet, majd a typedef használatával hozza létre: typedef struct student_data STUDENT_DATA;

Határozza meg a szerkezetet. Tartalmazzon két mutatót ugyanarra a struktúrára: struct diák_adatok { int diák_azonosítója; int tanulói_évfolyam; STUDENT_DATA bal, jobb;};

Rendeljen hozzá egy mutatót ehhez az adatstruktúrához, inicializálva azt NULL-ra, hogy ez legyen a fa feje: STUDENT_DATA *students = NULL;

Rendeljen két ideiglenes mutatót az adatstruktúrához: STUDENT_DATA új diák, cur_student;

A malloc() segítségével hozzon létre egy új elemet, mindig ellenőrizze a hibát: if ((new_student = malloc (sizeof (STUDENT_DATA))) == NULL) { abort(); }

Töltse ki az új elem mezőit. A bal és jobb oldali mezőket állítsa NULL-ra: new_student->student_ID = newID; új_hallgató->hallgató_méret = hírméret; új_hallgató->bal = NULL; új_hallgató->jobbra = NULL;

Tekintsük a fej változót. Ha a fejváltozó NULL, akkor ez az első elem, amelyet hozzáadunk a fához, ezért állítsuk be a head változót, hogy rámutasson, és kész is: if (!students) { students = new_student; Visszatérés; }

Kezelje a duplikált bejegyzést, ha az új érték és az aktuális érték egyenlő: if (newID == cur_student->student_ID) { abort(); }

Foglalkozz az egyenlőtlen értékekkel. Ha az új érték kisebb, mint az aktuális érték, az új elem balra kerül. Azonnal adja hozzá, ha nincs semmi a bal oldalon. Ellenkező esetben lépjen balra, és ismételje meg a ciklust: if (újID < tanuló_azonosítója) { if (cur_student->left == NULL) { cur_student->left = hírhallgató; visszatérés 1; } cur_student = cur_student->bal;

Tegye ugyanezt a jobb oldalon, különben: } else { if (cur_student->right == NULL) { cur_student->right = hírhallgató; visszatérés 1; } cur_student = cur_student->right; }}

Hozzon létre egy ideiglenes változót, amely az adatstruktúrára mutat: STUDENT_DATA *cur_student;

Lapozzon át az elemeken, és ellenőrizze a kívánt értéket: while (cur_student) { if (cur_student->student_ID == 15) { return cur_student->student_grade; }

Elágazás balra vagy jobbra, és ciklus, ha nem található: if (cur_student->student_ID < 15) { cur_student = cur_student->right; } else { cur_student = cur_student->left; }

Nézd meg, hogy a hurok véget ér-e. Ha igen, az azt jelenti, hogy soha nem találta meg az elemet: }return 0;

A program lejártakor bontsa ki a bináris fa kiosztását, mivel nem minden operációs rendszer kezeli ezt automatikusan. Ezt a legjobb egy rekurzív függvény használatával megtenni: void deallocate_binary_tree (STUDENT_DATA *fa) {

A bal és a jobb oldali részfa rekurzív felosztása: deallocate_binary_tree (fa->bal); deallocate_binary_tree (fa->jobbra);

A keresés és a bináris fákhoz való hozzáadás rekurzióval is elvégezhető. Ezt sokkal könnyebb lesz írni és karbantartani, de egy kicsit nehezebb megérteni, amíg meg nem szokja. Gyakori olyan bináris fa létrehozása, amely csak mutatókat tartalmaz egy második C adatszerkezetre, gyakran tömbre vagy linkelt listára, ahol a tényleges adatok találhatók. Minden bináris fa egy index, amellyel gyorsan kereshet a listaadatok egyetlen mezőjében.

A bináris fából való törlés egy nagyon bonyolult algoritmus C-ben, de a bináris fák sok felhasználásánál az elemek soha nem törlődnek.