Kuidas luua binaarset puud C-s

Struktureerige oma binaarne puu. Iga kahendpuu vajab struktuuri, isegi kui sellel on ainult üks muutuja. Valige nimi, seejärel kasutage selle loomiseks typedef-i: typedef struct student_data STUDENT_DATA;

Määratlege struktuur. Kaasake kaks osutit samale struktuurile: struct õpilase_andmed { int õpilase_ID; int õpilase_hinne; STUDENT_DATA vasakule, õige;};

Määrake sellele andmestruktuurile kursor, lähtestades selle NULL-i, et olla puu pea: STUDENT_DATA *õpilased = NULL;

Määrake andmestruktuurile kaks ajutist osutit: STUDENT_DATA uus_tudeng, cur_student;

Kasutage malloc() uue elemendi loomiseks, kontrollides alati vea olemasolu: if ((uus_tudeng = malloc (suurus (STUDENT_DATA))) == NULL) { abort(); }

Täitke uue elemendi väljad. Määra selle vasak- ja parempoolseks väljaks NULL: uus_õpilane->õpilase_ID = uus ID; uus_tudeng->õpilase_suurus = uudiste suurus; uus_õpilane->vasak = NULL; uus_õpilane->parempoolne = NULL;

Mõelge pea muutujale. Kui peamuutuja on NULL, on see esimene element, mis puusse lisatakse, nii et määrake pea muutuja sellele osutama ja ongi valmis: if (!õpilased) { õpilased = uus_õpilane; tagastamine; }

Käsitlege duplikaatkirjet, kui uus väärtus ja praegune väärtus on võrdsed: if (newID == cur_student-> student_ID) { abort(); }

Tegelege ebavõrdsete väärtustega. Kui uus väärtus on praegusest väiksem, läheb uus element vasakule. Lisage see kohe, kui vasakul pole midagi. Vastasel juhul liigu vasakule ja silmus: if (uusID < cur_student-> student_ID) { if (cur_student->left == NULL) { cur_student->left = uudistudeng; tagasi 1; } cur_student = cur_student->vasak;

Tehke sama asja paremal, muidu: } else { if (cur_student->right == NULL) { cur_student->right = uudistudeng; tagasi 1; } cur_student = cur_student->right; }}

Loo ajutine muutuja, mis osutab andmestruktuurile: STUDENT_DATA *cur_student;

Sirvige elemente, otsides soovitud väärtust: while (cur_student) { if (cur_student-> student_ID == 15) { return cur_student-> student_grade; }

Haru vasakule või paremale ja silmus, kui seda ei leitud: if (cur_student-> student_ID < 15) { cur_student = cur_student->right; } else { cur_student = cur_student->left; }

Vaadake, kas silmus lõpeb. Kui see on nii, tähendab see, et te ei leidnud kunagi eset: }return 0;

Programmi lõppedes eraldage binaarpuu jaotamine, kuna mitte kõik operatsioonisüsteemid ei tegele sellega automaatselt. Seda on kõige parem teha rekursiivse funktsiooni abil: void deallocate_binary_tree (STUDENT_DATA *tree) {

Deallocate vasak ja parem alampuu rekursiivselt: deallocate_binary_tree (puu->vasak); deallocate_binary_tree (puu->parem);

Otsingut ja kahendpuudele lisamist saab teha ka rekursiooni abil. Seda on palju lihtsam kirjutada ja hooldada, kuid veidi raskem mõista, kuni sellega harjub. Tavaline on luua binaarpuu, mis sisaldab ainult viiteid teise C-andmestruktuuri, sageli massiivi või lingitud loendi juurde, kus tegelikud andmed asuvad. Iga kahendpuu on indeks, mis võimaldab kiiresti otsida loendiandmete ühest väljast.

Binaarpuust kustutamine on C-s väga keeruline algoritm, kuid paljudes kahendpuude kasutusviisides ei kustutata elemente kunagi.