🎯 مقدمة عن أشجار البحث الثنائية
ما هي شجرة البحث الثنائية (BST)؟
شجرة البحث الثنائية هي شجرة ثنائية مرتبة بشكل متماثل. هذا يعني:
- كل عقدة تحتوي على مفتاح وقيمة مرتبطة
- مفتاح كل عقدة أكبر من جميع المفاتيح في شجرتها الفرعية اليسرى
- مفتاح كل عقدة أصغر من جميع المفاتيح في شجرتها الفرعية اليمنى
هيكل الشجرة الثنائية
الشجرة الثنائية إما:
- فارغة (null)
- عقدة تحتوي على مراجع إلى شجرتين ثنائيتين منفصلتين (الشجرتان الفرعيتان اليسرى واليمنى)
تشريح شجرة البحث الثنائية
ملاحظة: المفاتيح الأصغر من E على اليسار، والمفاتيح الأكبر من E على اليمين
🏗️ أساسيات أشجار البحث الثنائية
هيكل العقدة
⚠️ المتطلبات الأساسية
يجب أن ينفذ نوع المفتاح واجهة Comparable لعمليات الترتيب.
يجب أن تكون المفاتيح فريدة وتدعم عمليات المقارنة.
خصائص أشجار البحث الثنائية
| الخاصية | الوصف |
|---|---|
| الترتيب المتماثل | الشجرة الفرعية اليسرى < العقدة < الشجرة الفرعية اليمنى |
| الجذر | العقدة العلوية للشجرة |
| الورقة | عقدة بدون أطفال (كلتا الروابط null) |
| الأصل | العقدة التي لها رابطة إلى عقدة أخرى |
| العمق | عدد الروابط من الجذر إلى العقدة |
| الارتفاع | أقصى عمق لأي عقدة |
⚙️ عمليات أشجار البحث الثنائية
1. عملية البحث
خوارزمية البحث
القاعدة: إذا كانت أقل، اذهب لليسار؛ إذا كانت أكبر، اذهب لليمين؛ إذا تساوت، نجح البحث!
✅ تعقيد البحث
التكلفة: عدد المقارنات = 1 + عمق العقدة
أفضل حالة: O(log n) للشجرة المتوازنة
أسوأ حالة: O(n) للشجرة المتدهورة
2. عملية الإدراج
خوارزمية الإدراج
القاعدة: إذا كانت أقل، اذهب لليسار؛ إذا كانت أكبر، اذهب لليمين؛ إذا كانت null، أدخل!
مثال الإدراج: إضافة G إلى شجرة بحث ثنائية
- ابدأ من الجذر S (G < S، اذهب لليسار)
- قارن مع E (G > E، اذهب لليمين)
- قارن مع R (G < R، اذهب لليسار)
- قارن مع H (G < H، اذهب لليسار)
- H.left هي null → أدخل G هنا!
3. إيجاد الحد الأدنى/الأقصى
🗑️ حذف أشجار البحث الثنائية (حذف هيبارد)
⚠️ تعقيد الحذف
الحذف هو أكثر العمليات تعقيداً في أشجار البحث الثنائية. هناك ثلاث حالات يجب التعامل معها.
الحالة 0: لا يوجد أطفال (عقدة ورقة)
الحل: ببساطة احذف العقدة عن طريق تعيين رابط الأصل إلى null.
الحالة 1: طفل واحد
الحل: استبدل العقدة بطفلها (تجاوز العقدة).
الحالة 2: طفلان (الأكثر تعقيداً)
خوارزمية حذف هيبارد
- ابحث عن العقدة
tللحذف - ابحث عن الخليفة
x= الحد الأدنى للعقد في الشجرة الفرعية اليمنى لـt - احذف الحد الأدنى في الشجرة الفرعية اليمنى لـ
t - استبدل
tبـx:- عيّن
x.left = t.left - عيّن
x.right = deleteMin(t.right)
- عيّن
مثال: حذف E (له طفلان)
دالة مساعدة لحذف الحد الأدنى
تنفيذ الحذف الكامل
⚠️ مشكلة حذف هيبارد
حل غير مرضٍ: ليس متماثلاً!
النتيجة: تصبح الأشجار غير متوازنة بعد عمليات حذف كثيرة
تدهور الأداء: √N لكل عملية (بدلاً من log N)
مشكلة مفتوحة: حذف بسيط وفعال لأشجار البحث الثنائية لا يزال غير محلول!
بديل الحذف الكسول
نهج شاهد القبر
- عيّن قيمة العقدة إلى null
- اترك المفتاح في الشجرة لتوجيه عمليات البحث
- لا تعتبره متساوياً أثناء البحث
المشكلة: يزداد حمل الذاكرة مع الوقت (تكاثر شواهد القبور)
التكلفة: ~2 ln N' حيث N' = إجمالي المفاتيح المُدرجة أبداً
📊 تحليل الأداء
شكل الشجرة مهم!
التحليل الرياضي
إدراج عشوائي (الحالة المتوسطة)
الافتراض: إذا تم إدراج N من المفاتيح المميزة بترتيب عشوائي:
- العدد المتوقع للمقارنات: ~2 ln N ≈ 1.39 log₂ N
- الارتفاع المتوقع للشجرة: ~4.311 ln N (ريد، 2003)
البرهان: مراسلة 1-1 مع تقسيم الفرز السريع
أسوأ حالة
- الارتفاع: N - 1 (قائمة مرتبطة)
- يحدث عندما يتم إدراج المفاتيح بترتيب مصفى
- الاحتمال: صغير بشكل أسي للإدراجات العشوائية
جدول ملخص التعقيد
| العملية | أفضل حالة | الحالة المتوسطة | أسوأ حالة |
|---|---|---|---|
| بحث | log N | 1.39 log N | N |
| إدراج | log N | 1.39 log N | N |
| حذف | log N | √N | N |
| الحد الأدنى/الأقصى | log N | 1.39 log N | N |
⚠️ تدهور أداء الحذف
بعد عمليات حذف كثيرة باستخدام حذف هيبارد، تصبح الأشجار غير متوازنة!
جميع العمليات تتدهور إلى √N في المتوسط
💻 تنفيذ كامل لشجرة البحث الثنائية
هيكل الفئة
طرق إضافية مفيدة
اجتياز الشجرة
💡 نصيحة للاجتياز
الاجتياز بالترتيب لشجرة البحث الثنائية ينتج مفاتيح مرتبة!
لهذا تسمى "الترتيب المتماثل" - الاجتياز بالترتيب يحترم الترتيب.
📝 ملخص ومقارنة
مقارنة تنفيذ جدول الرموز
| التنفيذ | بحث (أسوأ) | إدراج (أسوأ) | حذف (أسوأ) | بحث (متوسط) | إدراج (متوسط) | حذف (متوسط) | مرتب؟ |
|---|---|---|---|---|---|---|---|
| بحث تسلسلي (قائمة غير مرتبة) |
N | N | N | N/2 | N | N/2 | ❌ |
| بحث ثنائي (مصفوفة مرتبة) |
log N | N | N | log N | N/2 | N/2 | ✅ |
| شجرة بحث ثنائية | N | N | N | 1.39 log N | 1.39 log N | √N | ✅ |
الاستنتاجات الرئيسية
✅ مزايا أشجار البحث الثنائية
- بحث وإدراج فعالان: O(log N) في المتوسط
- تدعم العمليات المرتبة (الحد الأدنى، الأقصى، الأرضية، السقف، الرتبة)
- الاجتياز بالترتيب يعطي ترتيباً مصفى
- هيكل ديناميكي (لا حاجة لتحديد الحجم مسبقاً)
- تنفيذ عودي بسيط
⚠️ قيود أشجار البحث الثنائية
- لا يوجد ضمان للأداء: يمكن أن تتدهور إلى O(N)
- الشكل يعتمد على ترتيب الإدراج
- عملية الحذف تتدهور الأداء إلى √N
- غير مناسبة عندما يكون الأداء المضمون مطلوباً
🚀 ما التالي؟
أشجار البحث الثنائية المتوازنة تحل مشكلة ضمان الأداء!
- أشجار 2-3: ضمان أداء log N
- أشجار الأحمر-أسود: تنفيذ عملي لأشجار البحث الثنائية المتوازنة
- أشجار AVL: أشجار متوازنة بشكل صارم
- أشجار B: للتخزين المستند إلى القرص
المحاضرة القادمة ستغطي كيفية ضمان الأداء اللوغاريتمي لجميع العمليات!
بطاقة مرجعية سريعة
ورقة غش لعمليات أشجار البحث الثنائية
| العملية | الخوارزمية | التعقيد (متوسط) |
|---|---|---|
| بحث | قارن، اذهب يسار/يمين، كرر | O(log N) |
| إدراج | ابحث، أدخل عند رابط null | O(log N) |
| حذف (0 أطفال) | عيّن رابط الأصل إلى null | O(log N) |
| حذف (1 طفل) | استبدل بالطفل | O(log N) |
| حذف (2 أطفال) | استبدل بالخليفة (هيبارد) | O(√N) |
| الحد الأدنى/الأقصى | اذهب كل اليسار/اليمين | O(log N) |
| أرضية/سقف | ابحث مع منطق احتياطي | O(log N) |
نصائح للدراسة
📚 كيف تتقن أشجار البحث الثنائية
- ارسم أشجاراً! تدرب على رسم الإدراج والحذف يدوياً
- تتبع الخوارزميات: اتبع الاستدعاءات العودية خطوة بخطوة
- قارن الحالات: أفضل مقابل متوسط مقابل أسوأ - افهم متى يحدث كل منها
- نفّذ من الصفر: اكتب الكود دون النظر إلى الملاحظات
- حلل التعقيد: دائماً احسب المقارنات وفكر في ارتفاع الشجرة
أسئلة امتحان شائعة
🎓 مسائل تدريبية
- ارسم شجرة البحث الثنائية الناتجة عن إدراج المفاتيح بالترتيب: 5, 2, 8, 1, 3, 7, 9
- اعرض خطوة بخطوة حذف عقدة بها طفلان
- ما هو أسوأ ارتفاع لشجرة بحث ثنائية بـ N عقدة؟
- لماذا يتدهور حذف هيبارد الأداء؟
- قارن بين شجرة البحث الثنائية والبحث الثنائي على المصفوفات - متى تستخدم كل منها؟
- اكتب كوداً عودياً لاجتياز أشجار البحث الثنائية (بالترتيب، مسبق، لاحق)