Hur man skapar ett binärt träd i C

Strukturera ditt binära träd. Varje binärt träd kommer att behöva en struktur, även om det bara har en variabel. Välj ett namn och använd sedan typedef för att skapa det: typedef struct student_data STUDENT_DATA;

Definiera strukturen. Inkludera två pekare till samma struktur: struct student_data { int student_ID; int student_grade; STUDENT_DATA vänster, höger;};

Tilldela en pekare till denna datastruktur, initialisera den till NULL, för att vara trädets huvud: STUDENT_DATA *studenter = NULL;

Tilldela två tillfälliga pekare till datastrukturen: STUDENT_DATA ny elev, cur_student;

Använd malloc() för att skapa ett nytt element, leta alltid efter ett fel: if ((new_student = malloc (sizeof (STUDENT_DATA))) == NULL) { abort(); }

Fyll i det nya elementets fält. Ställ in dess vänstra och högra fält till NULL: new_student->student_ID = newID; new_student->student_size = newsize; new_student->left = NULL; new_student->right = NULL;

Tänk på huvudvariabeln. Om head-variabeln är NULL, är detta det första elementet som läggs till i trädet, så ställ in head-variabeln att peka på den, och du är klar: if (!students) { students = new_student; lämna tillbaka; }

Hantera dubblettposten om det nya värdet och det aktuella värdet är lika: if (newID == cur_student->student_ID) { abort(); }

Ta itu med ojämlika värderingar. Om det nya värdet är mindre än det nuvarande värdet går det nya elementet till vänster. Lägg till det omedelbart om det inte finns något till vänster. Annars, gå åt vänster och loop: if (nytt-ID < cur_student->student_ID) { if (cur_student->left == NULL) { cur_student->left = newstudent; retur 1; } cur_student = cur_student->vänster;

Gör samma sak till höger, annars: } else { if (cur_student->right == NULL) { cur_student->right = newstudent; retur 1; } cur_student = cur_student->right; }}

Skapa en temporär variabel som pekar på datastrukturen: STUDENT_DATA *cur_student;

Bläddra igenom elementen och kontrollera efter önskat värde: while (cur_student) { if (cur_student->student_ID == 15) { return cur_student->student_grade; }

Förgrena sig åt vänster eller höger och loop, om den inte hittas: if (cur_student->student_ID < 15) { cur_student = cur_student->right; } annat { cur_student = cur_student->vänster; }

Se om slingan tar slut. Om den gör det betyder det att du aldrig hittade objektet: }return 0;

Avallokera det binära trädet när ditt program slutar, eftersom inte alla operativsystem kommer att hantera detta automatiskt. Detta görs bäst med en rekursiv funktion: void deallocate_binary_tree (STUDENT_DATA *tree) {

Avallokera vänster och höger underträd rekursivt: deallokera_binärt_träd (träd->vänster); deallocate_binary_tree (träd->höger);

Att söka och lägga till binära träd kan också göras med hjälp av rekursion. Detta kommer att vara mycket lättare att skriva och underhålla, men lite svårare att förstå, tills du vänjer dig vid det. Det är vanligt att skapa ett binärt träd som bara innehåller pekare till en andra C-datastruktur, ofta en array eller länkad lista, där den faktiska datan finns. Varje binärt träd är ett index för att snabbt söka i ett enda fält av listdata.

Att ta bort från ett binärt träd är en mycket komplicerad algoritm i C, men i många användningar av binära träd raderas element aldrig.