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

الشجرة الثنائية

آخر تحديث

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

تقوم الأشجار الثنائية عليها بنى كثيرة: أشجار البحث الثنائية، والأكوام (heaps)، وأشجار التعابير، وغيرها. تزور الاجتيازات كل عُقدة بترتيب محدد: الترتيب الأوسط والأمامي والخلفي هي الاجتيازات الثلاثة بالعمق، كلٌّ منها مفيد لمهام مختلفة.

المصطلحات

المصطلحالمعنى
الجذرالعُقدة العليا، بلا أب
الورقةعُقدة بلا أطفال
الارتفاعأطول مسار من الجذر إلى الورقة (بالحواف)
العمقبُعد العُقدة عن الجذر
مكتملةكل المستويات ممتلئة عدا الأخير ربما، ويُملأ من اليسار إلى اليمين

الاجتيازات الثلاثة بالعمق

الاجتيازالترتيبالاستخدام الشائع
الأوسطيسار، عُقدة، يمينمخرجات مرتبة لشجرة BST
الأماميعُقدة، يسار، يميننسخ / تسلسل الشجرة
الخلفييسار، يمين، عُقدةحذف / تقييم الشجرة

مثال محلول

الاجتياز الأوسط للشجرة المبنية من [4, 2, 6, 1, 3, 5] (المملوءة مستوى تلو الآخر):

الخطوةعند العُقدةالإجراء
14التعاود إلى الشجرة الفرعية اليسرى لـ 4 قبل زيارتها
22التعاود إلى الشجرة الفرعية اليسرى لـ 2 قبل زيارتها
31ورقة بلا طفل أيسر: تُزار 1، الخرج [1]
42اكتمل اليسار: تُزار 2، الخرج [1, 2]، ثم التعاود إلى اليمين
53ورقة: تُزار 3، الخرج [1, 2, 3]
64اكتملت الشجرة الفرعية اليسرى: تُزار 4، الخرج [1, 2, 3, 4]، ثم التعاود إلى اليمين
75الطفل الأيسر لـ 6، وهو ورقة: تُزار 5، الخرج [1, 2, 3, 4, 5]
86اكتمل اليسار ولا طفل أيمن: تُزار 6، الخرج [1, 2, 3, 4, 5, 6]

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

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

كود Binary Tree

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

كود Binary Tree بلغة Python

Python
1from collections import deque2
3
4class Node:5    def __init__(self, value):6        self.value = value7        self.left = None8        self.right = None9
10
11def insert(root, value):12    # Level-order insert: fill the first empty child slot found13    if root is None:14        return Node(value)15    queue = deque([root])16    while queue:17        node = queue.popleft()18        if node.left is None:19            node.left = Node(value)20            return root21        queue.append(node.left)22        if node.right is None:23            node.right = Node(value)24            return root25        queue.append(node.right)26
27
28def inorder(node):29    if node is None:30        return []31    return inorder(node.left) + [node.value] + inorder(node.right)32
33
34root = None35for value in [1, 2, 3, 4, 5, 6, 7]:36    root = insert(root, value)37
38print("Root:   ", root.value)39print("Inorder:", inorder(root))
شغّل هذا الكود في ساحة تجربة Python

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

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

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

ابدأ الآن