شجرة البحث الثنائية (Binary Search Tree)

<![CDATA[

مقدمة

في علم الحاسوب، شجرة البحث الثنائية (Binary Search Tree – BST)، وتسمى أيضًا شجرة ثنائية مرتبة أو مصنفة، هي هيكل بيانات شجرة ثنائية جذرية حيث يتم ترتيب العقد بطريقة معينة لتسهيل البحث والإضافة والحذف. تعتبر أشجار البحث الثنائية من الهياكل الأساسية في علم الحاسوب، وتستخدم على نطاق واسع في تطبيقات متنوعة مثل قواعد البيانات والفهرسة وخوارزميات البحث.

خصائص شجرة البحث الثنائية

تتميز شجرة البحث الثنائية بعدة خصائص أساسية تميزها عن غيرها من الأشجار الثنائية:

  • خاصية الترتيب: لكل عقدة في الشجرة، تكون جميع قيم العقد في الشجرة الفرعية اليسرى أقل من قيمة العقدة، وتكون جميع قيم العقد في الشجرة الفرعية اليمنى أكبر من قيمة العقدة.
  • الشجرة الثنائية: كل عقدة في الشجرة يمكن أن تحتوي على عقدتين فرعيتين كحد أقصى، وهما العقدة الفرعية اليسرى والعقدة الفرعية اليمنى.
  • العقدة الجذرية: تحتوي الشجرة على عقدة جذرية واحدة تمثل بداية الشجرة.

العمليات الأساسية على شجرة البحث الثنائية

يمكن إجراء العديد من العمليات الأساسية على شجرة البحث الثنائية، بما في ذلك:

  • البحث (Search): البحث عن عقدة معينة في الشجرة.
  • الإضافة (Insert): إضافة عقدة جديدة إلى الشجرة.
  • الحذف (Delete): حذف عقدة معينة من الشجرة.
  • الحد الأدنى (Minimum): إيجاد أصغر قيمة في الشجرة.
  • الحد الأقصى (Maximum): إيجاد أكبر قيمة في الشجرة.
  • الخلافة (Successor): إيجاد العقدة التي تأتي بعد عقدة معينة في الترتيب التصاعدي.
  • السلف (Predecessor): إيجاد العقدة التي تأتي قبل عقدة معينة في الترتيب التصاعدي.

خوارزميات البحث والإضافة والحذف

البحث (Search)

تعتمد خوارزمية البحث في شجرة البحث الثنائية على خاصية الترتيب. تبدأ الخوارزمية من العقدة الجذرية وتقارن القيمة المراد البحث عنها بقيمة العقدة الحالية. إذا كانت القيمة المراد البحث عنها أقل من قيمة العقدة الحالية، فإن الخوارزمية تستمر في البحث في الشجرة الفرعية اليسرى. وإذا كانت القيمة المراد البحث عنها أكبر من قيمة العقدة الحالية، فإن الخوارزمية تستمر في البحث في الشجرة الفرعية اليمنى. تستمر هذه العملية حتى يتم العثور على العقدة المطلوبة أو حتى يتم الوصول إلى عقدة فارغة (null)، مما يعني أن القيمة غير موجودة في الشجرة.

مثال توضيحي:

للبحث عن القيمة 15 في شجرة بحث ثنائية، تبدأ الخوارزمية من العقدة الجذرية. إذا كانت قيمة العقدة الجذرية أكبر من 15، فإن الخوارزمية تنتقل إلى الشجرة الفرعية اليسرى. وإذا كانت قيمة العقدة الجذرية أقل من 15، فإن الخوارزمية تنتقل إلى الشجرة الفرعية اليمنى. تستمر هذه العملية حتى يتم العثور على العقدة التي تحتوي على القيمة 15.

الإضافة (Insert)

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

مثال توضيحي:

لإضافة القيمة 12 إلى شجرة بحث ثنائية، تبدأ الخوارزمية من العقدة الجذرية. إذا كانت قيمة العقدة الجذرية أكبر من 12، فإن الخوارزمية تنتقل إلى الشجرة الفرعية اليسرى. وإذا كانت قيمة العقدة الجذرية أقل من 12، فإن الخوارزمية تنتقل إلى الشجرة الفرعية اليمنى. تستمر هذه العملية حتى يتم الوصول إلى مكان مناسب لإدراج العقدة التي تحتوي على القيمة 12.

الحذف (Delete)

حذف عقدة من شجرة البحث الثنائية يعتبر أكثر تعقيدًا من البحث والإضافة، حيث يجب التعامل مع حالات مختلفة:

  • الحالة الأولى: العقدة المراد حذفها هي عقدة ورقة (Leaf Node): في هذه الحالة، يتم ببساطة حذف العقدة.
  • الحالة الثانية: العقدة المراد حذفها لديها عقدة فرعية واحدة: في هذه الحالة، يتم استبدال العقدة المراد حذفها بعقدتها الفرعية.
  • الحالة الثالثة: العقدة المراد حذفها لديها عقدتين فرعيتين: في هذه الحالة، يتم استبدال العقدة المراد حذفها إما بأصغر قيمة في الشجرة الفرعية اليمنى (الخلافة) أو بأكبر قيمة في الشجرة الفرعية اليسرى (السلف). ثم يتم حذف العقدة التي تم استخدامها للاستبدال.

مثال توضيحي:

لحذف عقدة معينة من شجرة البحث الثنائية، يجب أولاً تحديد الحالة التي تنطبق على هذه العقدة (ورقة، عقدة ذات فرع واحد، أو عقدة ذات فرعين). ثم يتم اتباع الإجراء المناسب للحالة المحددة.

توازن شجرة البحث الثنائية

تعتبر شجرة البحث الثنائية متوازنة إذا كان ارتفاع الشجرة الفرعية اليسرى والشجرة الفرعية اليمنى لكل عقدة يختلف بمقدار واحد على الأكثر. الشجرة المتوازنة تضمن أداءً أفضل للعمليات الأساسية (البحث والإضافة والحذف) حيث يكون وقت التنفيذ في المتوسط O(log n)، حيث n هو عدد العقد في الشجرة. أما في حالة الشجرة غير المتوازنة (Skewed Tree)، فقد يصل وقت التنفيذ إلى O(n) في أسوأ الحالات.

هناك العديد من الخوارزميات المستخدمة لتحقيق توازن شجرة البحث الثنائية، مثل:

  • أشجار AVL: هي أشجار بحث ثنائية ذاتية التوازن، حيث يتم تدوير العقد للحفاظ على التوازن بعد كل عملية إضافة أو حذف.
  • أشجار أحمر-أسود (Red-Black Trees): هي نوع آخر من أشجار البحث الثنائية ذاتية التوازن، وتستخدم نظام الألوان (أحمر وأسود) لضمان التوازن.

تطبيقات شجرة البحث الثنائية

تستخدم أشجار البحث الثنائية في العديد من التطبيقات في علم الحاسوب، بما في ذلك:

  • قواعد البيانات: تستخدم في فهرسة البيانات لتسريع عمليات البحث والاسترجاع.
  • المترجمات (Compilers): تستخدم في بناء جداول الرموز لتخزين معلومات حول المتغيرات والدوال.
  • نظم التشغيل: تستخدم في إدارة الذاكرة وتخصيص الموارد.
  • الشبكات: تستخدم في خوارزميات التوجيه للعثور على أفضل مسار لنقل البيانات.
  • معالجة النصوص: تستخدم في خوارزميات البحث عن الكلمات والأنماط.

مزايا وعيوب شجرة البحث الثنائية

المزايا

  • كفاءة البحث: في المتوسط، توفر أشجار البحث الثنائية أداء بحث فعالًا (O(log n)) مقارنة بالهياكل الأخرى مثل القوائم المرتبطة (O(n)).
  • سهولة الإضافة والحذف: يمكن إضافة وحذف العقد بسهولة نسبية مقارنة بالهياكل الأخرى مثل المصفوفات المرتبة.
  • هيكل بيانات ديناميكي: يمكن لأشجار البحث الثنائية أن تنمو وتتقلص ديناميكيًا حسب الحاجة.

العيوب

  • الأداء في أسوأ الحالات: في حالة الشجرة غير المتوازنة، يمكن أن يتدهور الأداء إلى O(n).
  • تعقيد التنفيذ: يمكن أن يكون تنفيذ بعض العمليات، مثل الحذف، معقدًا.
  • استهلاك الذاكرة: تتطلب أشجار البحث الثنائية ذاكرة إضافية لتخزين المؤشرات (pointers) إلى العقد الفرعية.

أمثلة على استخدام شجرة البحث الثنائية

لنفترض أننا نريد بناء شجرة بحث ثنائية لتخزين معلومات عن الطلاب، حيث يتم استخدام رقم الطالب كمفتاح (key). يمكننا استخدام شجرة البحث الثنائية لتخزين هذه المعلومات بطريقة منظمة بحيث يمكننا البحث عن معلومات طالب معين بسرعة باستخدام رقمه.

مثال آخر: يمكن استخدام شجرة البحث الثنائية لتنفيذ قاموس (dictionary)، حيث يتم استخدام الكلمات كمفاتيح والتعريفات كقيم. يمكننا استخدام شجرة البحث الثنائية لتخزين هذه المعلومات بطريقة منظمة بحيث يمكننا البحث عن تعريف كلمة معينة بسرعة.

تحسينات على شجرة البحث الثنائية

هناك العديد من التحسينات التي يمكن إجراؤها على شجرة البحث الثنائية لتحسين الأداء وتقليل استهلاك الذاكرة، بما في ذلك:

  • أشجار ذاتية التوازن: استخدام أشجار ذاتية التوازن مثل أشجار AVL أو أشجار أحمر-أسود لضمان الأداء الأمثل في جميع الحالات.
  • ضغط البيانات: استخدام تقنيات ضغط البيانات لتقليل حجم الذاكرة المستخدمة لتخزين المعلومات في الشجرة.
  • التخزين المؤقت: استخدام التخزين المؤقت (caching) لتسريع عمليات البحث المتكررة.

خاتمة

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

المراجع

]]>

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *