Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

شجرة البحث الثنائية (BST)

آخر تحديث

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

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

التعقيد الزمني والمكاني

العمليةمتوازنةأسوأ حالة (منحرفة)
البحثO(log n)O(n)
الإدراجO(log n)O(n)
الحذفO(log n)O(n)
المساحةO(n)O(n)

خطوة بخطوة (الإدراج)

الخطوةماذا يحدث
1إذا كانت الشجرة فارغة، تصبح القيمة الجديدة الجذر.
2وإلا فابدأ من الجذر.
3إذا كانت القيمة أصغر، انتقل إلى الابن الأيسر؛ وإذا كانت أكبر، انتقل يمينًا.
4كرر حتى تصل إلى مكان فارغ.
5اربط القيمة الجديدة هناك كورقة.

مثال محلول

إدراج [5, 3, 8, 1, 4] في شجرة فارغة، قيمة واحدة في كل مرة:

إدراجالمسار المتّبعالإجراء
5-الشجرة فارغة، لذا يصبح 5 الجذر.
353 < 5، انتقل يسارًا؛ المكان فارغ، اربط 3 كابن أيسر لـ 5.
858 > 5، انتقل يمينًا؛ المكان فارغ، اربط 8 كابن أيمن لـ 5.
15 -> 31 < 5 انتقل يسارًا، ثم 1 < 3 انتقل يسارًا؛ اربط 1 كابن أيسر لـ 3.
45 -> 34 < 5 انتقل يسارًا، ثم 4 > 3 انتقل يمينًا؛ اربط 4 كابن أيمن لـ 3.

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

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

كود Binary Search Tree

تنفيذ نظيف وقابل للتشغيل لخوارزمية Binary Search Tree بلغات Python, JavaScript, Java, C++, C. اختر لغة، وانسخ الكود، أو افتحه محمّلًا مسبقًا في ساحة تجربة Coddy.

كود Binary Search Tree بلغة Python

Python
1class Node:2    def __init__(self, key):3        self.key = key4        self.left = None5        self.right = None6
7
8def insert(node, key):9    if node is None:10        return Node(key)11    if key < node.key:12        node.left = insert(node.left, key)13    elif key > node.key:14        node.right = insert(node.right, key)15    return node  # duplicates are ignored16
17
18def search(node, key):19    if node is None:20        return False21    if key == node.key:22        return True23    if key < node.key:24        return search(node.left, key)25    return search(node.right, key)26
27
28def inorder(node):29    if node is None:30        return []31    return inorder(node.left) + [node.key] + inorder(node.right)32
33
34root = None35for key in [8, 3, 10, 1, 6, 14, 4, 7]:36    root = insert(root, key)37
38print("Inorder (sorted):", inorder(root))39print("search(6): ", search(root, 6))40print("search(5): ", search(root, 5))
شغّل هذا الكود في ساحة تجربة Python

الأسئلة الشائعة حول شجرة البحث الثنائية

ما هو التعقيد الزمني لشجرة البحث الثنائية؟
البحث والإدراج والحذف هي O(log n) في شجرة متوازنة، لأن كل مقارنة تتخلص من نصف العقد المتبقية. في أسوأ حالة - شجرة منحرفة إلى سلسلة بسبب الإدراجات المرتبة - تتدهور إلى O(n).
ما الفرق بين الشجرة الثنائية وشجرة البحث الثنائية؟
الشجرة الثنائية هي أي شجرة يكون فيها لكل عقدة طفلان على الأكثر، دون قاعدة ترتيب. تضيف شجرة البحث الثنائية الثابتة القائلة بأن قيم الشجرة الفرعية اليسرى أصغر وقيم اليمنى أكبر من العقدة، وهذا ما يتيح البحث السريع.
لماذا قد تصبح شجرة البحث الثنائية بطيئة؟
إذا أُدرجت القيم بترتيب مرتب (أو معكوس)، تذهب كل عقدة جديدة إلى الجهة نفسها، مُنتِجةً شجرة طويلة منحرفة تتصرف كقائمة مترابطة - O(n) لكل عملية. تدير الأشجار ذاتية التوازن (AVL، الحمراء-السوداء) العقد لمنع ذلك.
ما الفرق بين شجرة البحث الثنائية وجدول التجزئة؟
يوفر جدول التجزئة عمليات بحث بمتوسط O(1) لكنه يخزن المفاتيح دون ترتيب معين، لذا لا يمكنه الإجابة عن استعلامات النطاق أو الخلف. شجرة البحث الثنائية أبطأ قليلًا عند O(log n) لكنها تبقي المفاتيح مرتبة، مما يتيح اجتيازها بالترتيب وإيجاد أقرب القيم. اختر BST عندما يهم الترتيب وجدول التجزئة عندما تحتاج فقط إلى اختبارات العضوية.
متى ينبغي أن أستخدم شجرة ذاتية التوازن بدلًا من BST عادية؟
استخدم شجرة ذاتية التوازن (AVL، الحمراء-السوداء) كلما تعذّر عليك التحكم في ترتيب الإدراج واحتجت إلى أداء O(log n) مضمون. شجرة BST العادية مناسبة للتعليم، ولمجموعات البيانات الصغيرة، أو عندما تصل المفاتيح بترتيب عشوائي، لكنها لا توفر أي حماية من أسوأ حالة منحرفة.
هل يعيد الاجتياز الترتيبي لشجرة BST قيمًا مرتبة؟
نعم. زيارة الشجرة الفرعية اليسرى، ثم العقدة، ثم الشجرة الفرعية اليمنى تُنتج المفاتيح بترتيب تصاعدي، وهو ما ينبع مباشرة من ثابت BST. من الأخطاء الشائعة توقع الشيء نفسه من شجرة ثنائية عادية: دون قاعدة الترتيب، لا يُنتج الاجتياز الترتيبي أي تسلسل ذي معنى.
Coddy programming languages illustration

أتقن الخوارزميات مع Coddy

ابدأ الآن