כיצד ליצור עץ בינארי ב-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->תלמיד_size = new_size; new_student->left = NULL; new_student->right = NULL;

קחו בחשבון את משתנה הראש. אם משתנה 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 (עץ->שמאלי); deallocate_binary_tree (עץ->ימין);

חיפוש והוספה לעצים בינאריים יכולים להתבצע גם באמצעות רקורסיה. זה יהיה הרבה יותר קל לכתוב ולתחזק, אבל קצת יותר קשה להבנה, עד שתתרגל לזה. מקובל ליצור עץ בינארי המכיל רק מצביעים למבנה נתונים C שני, לרוב מערך או רשימה מקושרת, שבו הנתונים בפועל נמצאים. כל עץ בינארי הוא אינדקס לחיפוש מהיר בשדה בודד של נתוני הרשימה.

מחיקה מעץ בינארי היא אלגוריתם מסובך מאוד ב-C, אך בשימושים רבים של עצים בינאריים, אלמנטים לעולם לא נמחקים.