Binary Search Tree (BST)
شجرة البحث الثنائية Binary Search Tree (BST)
شجرة البحث الثنائية تحافظ على خاصية ترتيب: كل عقدة أكبر من عقد شجرتها اليسرى وأصغر من عقد شجرتها اليمنى — تتيح بحثًا وإدراجًا وحذفًا بتعقيد O(log n) إن كانت متوازنة.
خاصية الترتيب تُطبَّق تعاوديًا على كل شجرة فرعية، ما يجعل البحث يستبعد نصف العناصر المتبقية بكل خطوة (كالبحث الثنائي على مصفوفة، لكن ببنية شجرية ديناميكية تدعم الإدراج والحذف بكفاءة أيضًا). التعقيد O(log n) مضمون فقط إن بقيت الشجرة متوازنة تقريبًا.
الصياغة
class Node:
def __init__(self, value):
self.value = value
self.left = None
self.right = None
def insert(node, value):
if node is None:
return Node(value)
if value < node.value:
node.left = insert(node.left, value)
else:
node.right = insert(node.right, value)
return node📄 مثال
class Node:
def __init__(self, value):
self.value = value
self.left = None
self.right = None
def insert(node, value):
if node is None:
return Node(value)
if value < node.value:
node.left = insert(node.left, value)
else:
node.right = insert(node.right, value)
return node
def search(node, value):
if node is None or node.value == value:
return node is not None
if value < node.value:
return search(node.left, value)
return search(node.right, value)
root = None
for v in [5, 3, 8, 1, 4]:
root = insert(root, v)
print(search(root, 4)) # True
print(search(root, 10)) # Falseأهم النقاط
| النقطة | الوظيفة |
|---|---|
| التعقيد الزمني (متوازنة) | O(log n) للبحث والإدراج والحذف |
| التعقيد الزمني (غير متوازنة) | O(n) بأسوأ حالة — تنهار عمليًا لقائمة مترابطة (إدراج عناصر مرتّبة سلفًا مثلًا) |
| الحل للانهيار | أشجار متوازنة تلقائيًا مثل AVL وRed-Black تضمن O(log n) دائمًا |
💡 نصائح عملية
- الاجتياز بالترتيب (In-order Traversal: يسار ثم الجذر ثم يمين) يُعيد كل عناصر BST مرتّبة تصاعديًا — طريقة سريعة لفرز عناصرها
⚠️ أخطاء شائعة
- افتراض أن أي BST سرعتها O(log n) دائمًا — هذا مضمون فقط بالأشجار المتوازنة، شجرة عادية قد تنهار لـ O(n) مع ترتيب إدخال سيء
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار DSA الكامل بالعربي.