Zbuduj swoje drzewo binarne. Każde drzewo binarne będzie wymagało struktury, nawet jeśli ma tylko jedną zmienną. Wybierz nazwę, a następnie użyj typedef, aby ją utworzyć: typedef struct student_data STUDENT_DATA;
Zdefiniuj strukturę. Dołącz dwa wskaźniki do tej samej struktury: struct student_data { int student_ID; int student_grade; STUDENT_DATA lewo, prawidłowy;};
Przydziel wskaźnik do tej struktury danych, inicjując ją na NULL, aby był nagłówkiem drzewa: STUDENT_DATA *students = NULL;
Przydziel dwa tymczasowe wskaźniki do struktury danych: STUDENT_DATA nowy uczeń, obecny_uczeń;
Użyj malloc(), aby utworzyć nowy element, zawsze sprawdzając, czy nie ma błędu: if ((new_student = malloc (sizeof (STUDENT_DATA))) == NULL) { abort(); }
Wypełnij pola nowego elementu. Ustaw jego lewe i prawe pola na NULL: new_student->student_ID = newID; nowy_uczeń->rozmiar_ucznia = nowy rozmiar; nowy_uczeń->po lewej = NULL; nowy_uczeń->prawo = NULL;
Rozważ zmienną głowy. Jeśli zmienna head ma wartość NULL, jest to pierwszy element dodany do drzewa, więc ustaw zmienną head tak, aby wskazywała na nią i gotowe: if (!students) { students = new_student; powrót; }
Obsłuż zduplikowany wpis, jeśli nowa wartość i bieżąca wartość są równe: if (newID == cur_student->student_ID) { abort(); }
Zajmij się nierównymi wartościami. Jeśli nowa wartość jest mniejsza niż aktualna, nowy element znajduje się po lewej stronie. Dodaj go natychmiast, jeśli po lewej stronie nie ma nic. W przeciwnym razie przejdź w lewo i wykonaj pętlę: if (newID < cur_student->student_ID) { if (cur_student->left == NULL) { cur_student->left = newstudent; powrót 1; } cur_student = cur_student->po lewej;
Zrób to samo po prawej stronie, w przeciwnym razie: } else { if (cur_student->right == NULL) { cur_student->right = newstudent; powrót 1; } cur_student = cur_student->w prawo; }}
Utwórz zmienną tymczasową wskazującą na strukturę danych: STUDENT_DATA *cur_student;
Przewiń elementy, sprawdzając żądaną wartość: while (obecny_uczeń) { if (obecny_uczeń->identyfikator_ucznia == 15) { return aktualny_uczeń->klasa_studenta; }
Rozgałęzienie w lewo lub w prawo i pętla, jeśli nie zostanie znalezione: if (cur_student->student_ID < 15) { cur_student = cur_student->right; } else { cur_student = cur_student-> left; }
Sprawdź, czy pętla się kończy. Jeśli tak, oznacza to, że nigdy nie znalazłeś elementu: }return 0;
Zwolnij przydział drzewa binarnego po zakończeniu programu, ponieważ nie wszystkie systemy operacyjne obsłużą to automatycznie. Najlepiej zrobić to za pomocą funkcji rekurencyjnej: void deallocate_binary_tree (STUDENT_DATA *tree) {
Zwolnij rekurencyjnie lewe i prawe poddrzewa: deallocate_binary_tree (tree->left); deallocate_binary_tree (drzewo->prawo);
Wyszukiwanie i dodawanie do drzew binarnych można również wykonać za pomocą rekurencji. Będzie to znacznie łatwiejsze do napisania i utrzymania, ale trochę trudniejsze do zrozumienia, dopóki się do tego nie przyzwyczaisz. Często tworzy się drzewo binarne, które zawiera tylko wskaźniki do drugiej struktury danych C, często tablicy lub połączonej listy, gdzie znajdują się rzeczywiste dane. Każde drzewo binarne jest indeksem do szybkiego przeszukiwania pojedynczego pola danych listy.
Usuwanie z drzewa binarnego jest bardzo skomplikowanym algorytmem w C, ale w wielu zastosowaniach drzew binarnych elementy nigdy nie są usuwane.