Hoe maak je een binaire boom in C

Structureer uw binaire boom. Elke binaire boom heeft een structuur nodig, zelfs als deze maar één variabele heeft. Kies een naam en gebruik vervolgens typedef om het aan te maken: typedef struct student_data STUDENT_DATA;

Definieer de structuur. Voeg twee verwijzingen naar dezelfde structuur toe: struct student_data { int student_ID; int student_grade; STUDENT_DATA links, Rechtsaf;};

Wijs een aanwijzer toe aan deze gegevensstructuur, initialiseer deze naar NULL, als de kop van de boom: STUDENT_DATA *students = NULL;

Wijs twee tijdelijke verwijzingen toe aan de gegevensstructuur: STUDENT_DATA nieuwe leerling, cur_student;

Gebruik malloc() om een ​​nieuw element te maken en controleer altijd op een fout: if ((new_student = malloc (sizeof (STUDENT_DATA))) == NULL) { abort(); }

Vul de velden van het nieuwe element in. Stel de linker- en rechtervelden in op NULL: new_student->student_ID = newID; new_student->student_size = nieuwe maat; new_student->links = NULL; new_student->rechts = NULL;

Overweeg de hoofdvariabele. Als de head-variabele NULL is, is dit het eerste element dat aan de boom wordt toegevoegd, dus stel de head-variabele in om ernaar te wijzen, en je bent klaar: if (!students) { students = new_student; opbrengst; }

Behandel de dubbele invoer als de nieuwe waarde en de huidige waarde gelijk zijn: if (newID == cur_student->student_ID) { abort(); }

Omgaan met ongelijke waarden. Als de nieuwe waarde kleiner is dan de huidige waarde, gaat het nieuwe element naar links. Voeg het onmiddellijk toe als er niets aan de linkerkant is. Ga anders naar links en loop: if (newID < cur_student->student_ID) { if (cur_student->left == NULL) { cur_student->left = newstudent; retour 1; } cur_student = cur_student->links;

Doe hetzelfde aan de rechterkant, anders: } else { if (cur_student->right == NULL) { cur_student->right = newstudent; retour 1; } cur_student = cur_student->rechts; }}

Maak een tijdelijke variabele die verwijst naar de datastructuur: STUDENT_DATA *cur_student;

Loop door de elementen en controleer op de gewenste waarde: while (cur_student) { if (cur_student->student_ID == 15) { return cur_student->student_grade; }

Vertakking naar links of rechts, en loop, als het niet wordt gevonden: if (cur_student->student_ID < 15) { cur_student = cur_student->right; } else { cur_student = cur_student->links; }

Kijk of de lus eindigt. Als dit het geval is, betekent dit dat u het item nooit hebt gevonden: }return 0;

Maak de toewijzing van de binaire structuur ongedaan wanneer uw programma eindigt, aangezien niet alle besturingssystemen dit automatisch zullen verwerken. Dit kunt u het beste doen met een recursieve functie: void deallocate_binary_tree (STUDENT_DATA *tree) {

Deallocate de linker en rechter subtrees recursief: deallocate_binary_tree (tree->left); deallocate_binary_tree (boom->rechts);

Zoeken en toevoegen aan binaire bomen kan ook met recursie. Dit zal veel gemakkelijker te schrijven en te onderhouden zijn, maar een beetje moeilijker te begrijpen, totdat je eraan gewend raakt. Het is gebruikelijk om een ​​binaire boom te maken die alleen verwijzingen bevat naar een tweede C-gegevensstructuur, vaak een array of gekoppelde lijst, waar de feitelijke gegevens zich bevinden. Elke binaire boom is een index om snel een enkel veld van de lijstgegevens te doorzoeken.

Verwijderen uit een binaire boom is een zeer gecompliceerd algoritme in C, maar bij veel toepassingen van binaire bomen worden elementen nooit verwijderd.