كيفية إنشاء هيكل بيانات شجرة في C++ باستخدام المكررات
كثيرًا ما تتطلب البرمجة استخدام هياكل البيانات لإدارة المعلومات بكفاءة. واحدة من هياكل البيانات الشائعة الاستخدام هي الشجرة
. ستتناول هذه الدليل كيف يمكنك إنشاء هيكل بيانات شجرة
في C++ باستخدام المكررات بدلاً من المؤشرات، مما يوفر لك طريقة قوية للتعامل مع البيانات الهرمية.
فهم المشكلة
قد تتساءل، كيف يمكنني تنفيذ شجرة في C++ تستخدم المكررات للتنقل؟ يمكن أن تسهل هذه الطريقة التنقل والتعامل مع عقد الشجرة دون الحاجة إلى إدارة المؤشرات بشكل صريح، مما يمكن أن يكون عرضة للأخطاء ومعقدًا.
قد يكون من الصعب العثور على تنفيذ شجرة متاح بسهولة في مكتبة C++ القياسية (STL). لحسن الحظ، هناك خيارات مثل tree.hh
التي تلبي هذه الحاجة.
استكشاف تنفيذ شجرة بسيطة
استخدام tree.hh
، وهو ملف رأس محدد يوفر تنفيذ شجرة، هو إحدى الطرق الموصى بها. أدناه هو تحليل بسيط لكيفية إنشاء والتعامل مع الأشجار باستخدام هذه المكتبة.
الهيكل الأساسي
هنا مقتطف كود بسيط يوضح كيفية إنشاء شجرة:
#include <iostream>
#include "tree.hh"
using namespace std;
int main() {
tree<int> myTree;
tree<int>::iterator i = myTree.root();
*i = 42; // تعيين قيمة الجذر
// إضافة طفل إلى الجذر
tree<int>::iterator j = i.add_child();
*j = 777; // تعيين قيمة الطفل
j = j.parent(); // التنقل إلى الجذر
// مقارنة المكررات
if (i == myTree.root() && i == j)
cout << "i و j كلاهما يشيران إلى الجذر\n";
return 0;
}
تحليل الكود
-
الرأس والفضاء الاسمي: توجيه
#include
يستورد مكتبة الشجرة، بينما يسمح لناusing namespace std;
باستخدام مكونات المكتبة القياسية بشكل مريح. -
إنشاء الشجرة: تم تهيئة نسخة من الشجرة
myTree
بالنوعint
. -
إضافة العقد: يمكن إضافة العقد بكفاءة باستخدام
add_child()
، ويمكن تعيين القيم مباشرة باستخدام عامل الإرجاع (dereference operator). -
التنقل في الشجرة: يمكنك التنقل بسهولة إلى العقدة الأب باستخدام طريقة
parent()
.
الميزات الإضافية مع tree.hh
توفر مكتبة tree.hh
وظائف إضافية للتعامل مع الشجرة، مثل:
-
المكررات: والتي تسمح بالتنقل عبر عناصر الشجرة (مثل الأشقاء).
-
مكررات الأشقاء: للوصول إلى والتعامل مع العقد الأشقاء بسهولة.
مثال على الاستخدام المتقدم
إليك كيفية استخدام tree.hh
بشكل أوسع:
int main(int argc, char **argv) {
tree<string> tr;
tree<string>::iterator top = tr.begin();
// بناء الشجرة
tree<string>::iterator one = tr.insert(top, "one");
tree<string>::iterator two = tr.append_child(one, "two");
tr.append_child(two, "apple");
// إضافة المزيد من الأطفال
tr.append_child(two, "banana");
tr.append_child(one, "three");
// البحث عن عقدة
auto loc = find(tr.begin(), tr.end(), "two");
if(loc != tr.end()) {
tree<string>::sibling_iterator sib = tr.begin(loc);
while(sib != tr.end(loc)) {
cout << (*sib) << endl;
++sib;
}
}
}
ما يمكنك فعله
-
أدخل وأضف الأطفال بسهولة: تساعد طرق
insert
وappend_child
في إدارة هيكل الشجرة دون معرفة عميقة بإدارة المؤشرات. -
وظيفة البحث: استخدم خوارزميات STL للعثور على العقد داخل الشجرة بكفاءة.
خيارات بديلة
إذا كنت تبحث عن هيكل مرتبط بفوائد مشابهة للأشجار، فكر في استخدام map
:
- ضمانات الأداء: توفر المابس عملية بحث وإدخال وحذف لوغاريتمية، مما يجعلها فعالة للعديد من حالات الاستخدام.
- إدارة مؤتمتة: تدير الخرائط هيكلها الداخلي، مما يقلل من التعقيد بالنسبة للمطور.
الخاتمة
يمكن أن يبسط إنشاء هيكل بيانات شجرة
في C++ باستخدام المكررات المهام البرمجية المتعلقة بإدارة البيانات الهرمية. تعد مكتبة tree.hh
حلاً قويًا يستحق الاستكشاف لمن يرغبون في تجنب تعقيدات المؤشرات. تذكر أن استخدام maps
يمكن أن يوفر أيضًا وظائف مماثلة عند الحاجة.
مع هذا الدليل، يجب أن يكون لديك أساس قوي لبدء إنشاء والتعامل مع الأشجار في تطبيقات C++ الخاصة بك.