كيفية إنشاء شجرة ثنائية في لغة سي

قم ببناء شجرتك الثنائية. ستحتاج كل شجرة ثنائية إلى بنية ، حتى لو كانت تحتوي على متغير واحد فقط. اختر اسمًا ، ثم استخدم typedef لإنشائه: typedef architecture student_data STUDENT_DATA ؛

حدد الهيكل. قم بتضمين مؤشرين لنفس البنية: البنية student_data {int student_ID؛ int student_grade؛ STUDENT_DATA اليسار، الصحيح؛}؛

قم بتخصيص مؤشر لهيكل البيانات هذا ، وتهيئته إلى NULL ، ليكون رأس الشجرة: STUDENT_DATA * students = NULL؛

قم بتخصيص مؤشرين مؤقتين لهيكل البيانات: STUDENT_DATA طالب جديد، الطالب الحالي

استخدم malloc () لإنشاء عنصر جديد ، والتحقق دائمًا من وجود خطأ: if ((new_student = malloc (sizeof (STUDENT_DATA))) == NULL) {abort ()؛ }

قم بتعبئة حقول العنصر الجديد. عيّن حقليها الأيمن والأيسر إلى NULL: new_student-> student_ID = newID ؛ new_student-> student_size = newsize ؛ new_student-> يسار = NULL ؛ new_student-> right = NULL؛

ضع في اعتبارك متغير الرأس. إذا كان متغير head هو NULL ، فهذا هو العنصر الأول المضاف إلى الشجرة ، لذا اضبط متغير head للإشارة إليه ، وقد انتهيت: if (! students) {students = new_student؛ إرجاع؛ }

تعامل مع الإدخال المكرر إذا كانت القيمة الجديدة والقيمة الحالية متساويتين: if (newID == cur_student-> student_ID) {abort ()؛ }

تعامل مع القيم غير المتكافئة. إذا كانت القيمة الجديدة أقل من القيمة الحالية ، ينتقل العنصر الجديد إلى اليسار. أضفه على الفور إذا لم يكن هناك شيء على اليسار. خلاف ذلك ، اجتياز اليسار والحلقة: if (newID student_ID) {if (cur_student-> left == NULL) {cur_student-> left = newstudent؛ العودة 1 ؛ } cur_student = cur_student-> يسار ؛

افعل نفس الشيء على اليمين ، وإلا:} 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؛

قم بإلغاء تخصيص الشجرة الثنائية عند انتهاء برنامجك ، حيث لن تتعامل جميع أنظمة التشغيل مع هذا الأمر تلقائيًا. من الأفضل القيام بذلك باستخدام دالة تكرارية: باطل deallocate_binary_tree (شجرة STUDENT_DATA *) {

قم بإلغاء تخصيص الأشجار الفرعية اليمنى واليسرى بشكل متكرر: deallocate_binary_tree (الشجرة-> اليسار) ؛ deallocate_binary_tree (شجرة-> يمين) ؛

يمكن أيضًا إجراء البحث والإضافة إلى الأشجار الثنائية باستخدام العودية. سيكون هذا أسهل في الكتابة والمحافظة عليه ، ولكن يصعب فهمه قليلاً ، حتى تعتاد عليه. من الشائع إنشاء شجرة ثنائية تحتوي على مؤشرات فقط في بنية بيانات C ثانية ، غالبًا ما تكون مصفوفة أو قائمة مرتبطة ، حيث توجد البيانات الفعلية. كل شجرة ثنائية عبارة عن فهرس للبحث بسرعة في حقل واحد من بيانات القائمة.

يعد الحذف من شجرة ثنائية خوارزمية معقدة للغاية في لغة C ، ولكن في العديد من استخدامات الأشجار الثنائية ، لا يتم حذف العناصر أبدًا.