Πώς να δημιουργήσετε ένα δυαδικό δέντρο στο C

Δομήστε το δυαδικό δέντρο σας. Κάθε δυαδικό δέντρο θα χρειαστεί μια δομή, ακόμα κι αν έχει μόνο μία μεταβλητή. Επιλέξτε ένα όνομα και, στη συνέχεια, χρησιμοποιήστε το typedef για να το δημιουργήσετε: typedef struct student_data STUDENT_DATA;

Καθορίστε τη δομή. Συμπεριλάβετε δύο δείκτες στην ίδια δομή: struct student_data { int student_ID; int student_grade; STUDENT_DATA αριστερά, σωστά;};

Εκχωρήστε έναν δείκτη σε αυτήν τη δομή δεδομένων, αρχικοποιώντας τον σε NULL, ώστε να είναι η κεφαλή του δέντρου: STUDENT_DATA *students = NULL;

Εκχωρήστε δύο προσωρινούς δείκτες στη δομή δεδομένων: STUDENT_DATA Νέος μαθητής, cur_student;

Χρησιμοποιήστε malloc() για να δημιουργήσετε ένα νέο στοιχείο, ελέγχοντας πάντα για σφάλμα: if ((new_student = malloc (sizeof (STUDENT_DATA))) == NULL) { abort(); }

Συμπληρώστε τα πεδία του νέου στοιχείου. Ορίστε το αριστερό και το δεξί του πεδίο σε NULL: new_student->student_ID = newID; new_student->student_size = newsize; new_student->left = NULL; new_student->right = NULL;

Εξετάστε τη μεταβλητή head. Εάν η μεταβλητή head είναι NULL, αυτό είναι το πρώτο στοιχείο που προστίθεται στο δέντρο, οπότε ορίστε τη μεταβλητή head ώστε να δείχνει σε αυτήν και τελειώσατε: if (!students) { Students = new_student; ΕΠΙΣΤΡΟΦΗ; }

Χειριστείτε τη διπλότυπη καταχώρηση εάν η νέα τιμή και η τρέχουσα τιμή είναι ίσες: if (newID == cur_student->student_ID) { abort(); }

Αντιμετωπίστε τις άνισες αξίες. Εάν η νέα τιμή είναι μικρότερη από την τρέχουσα τιμή, το νέο στοιχείο πηγαίνει στα αριστερά. Προσθέστε το αμέσως εάν δεν υπάρχει τίποτα στα αριστερά. Διαφορετικά, περάστε αριστερά και κάντε βρόχο: if (newID < cur_student->student_ID) { if (cur_student->left == NULL) { cur_student->left = newstudent; επιστροφή 1; } cur_student = cur_student->left;

Κάντε το ίδιο στα δεξιά, διαφορετικά: } else { if (cur_student->right == NULL) { cur_student->right = newstudent; επιστροφή 1; } cur_student = cur_student->right; }}

Δημιουργήστε μια προσωρινή μεταβλητή που δείχνει στη δομή δεδομένων: STUDENT_DATA *cur_student;

Κάντε βρόχο στα στοιχεία, ελέγχοντας για την επιθυμητή τιμή: while (cur_student) { if (cur_student->student_ID == 15) { return cur_student->student_grade; }

Διακλαδώστε αριστερά ή δεξιά και κάντε βρόχο, εάν δεν βρεθεί: if (cur_student->student_ID < 15) { cur_student = cur_student->right; } else { cur_student = cur_student->left; }

Δείτε αν τελειώνει ο βρόχος. Εάν το κάνει, σημαίνει ότι δεν βρήκατε ποτέ το αντικείμενο: }return 0;

Κατανείμετε το δυαδικό δέντρο όταν τελειώσει το πρόγραμμά σας, καθώς δεν θα το χειριστούν αυτόματα όλα τα λειτουργικά συστήματα. Αυτό γίνεται καλύτερα χρησιμοποιώντας μια αναδρομική συνάρτηση: void deallocate_binary_tree (STUDENT_DATA *tree) {

Κατανομή του αριστερού και του δεξιού υποδέντρου αναδρομικά: deallocate_binary_tree (tree->left); deallocate_binary_tree (δέντρο->δεξιά);

Η αναζήτηση και η προσθήκη σε δυαδικά δέντρα μπορεί επίσης να γίνει με χρήση αναδρομής. Αυτό θα είναι πολύ πιο εύκολο να το γράψετε και να το διατηρήσετε, αλλά λίγο πιο δύσκολο να το καταλάβετε, μέχρι να το συνηθίσετε. Είναι σύνηθες να δημιουργείτε ένα δυαδικό δέντρο που περιέχει μόνο δείκτες σε μια δεύτερη δομή δεδομένων C, συχνά έναν πίνακα ή μια συνδεδεμένη λίστα, όπου βρίσκονται τα πραγματικά δεδομένα. Κάθε δυαδικό δέντρο είναι ένα ευρετήριο για γρήγορη αναζήτηση σε ένα μόνο πεδίο των δεδομένων της λίστας.

Η διαγραφή από ένα δυαδικό δέντρο είναι ένας πολύ περίπλοκος αλγόριθμος στο C, αλλά σε πολλές χρήσεις δυαδικών δέντρων, τα στοιχεία δεν διαγράφονται ποτέ.