الانتقال إلى المحتوى الرئيسي

كيف يمكنني إنشاء شجرة التسلسل الهرمي في ج?

  • المهندس هزار الخطيب بني جماعة الكناني
  • المدونة

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

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

عقدة البنية {

بيانات كثافة العمليات;

عقدة البنية * اليسار;

عقدة البنية * حق;

};

بعد تحديد بنية العقدة ، يمكنك إنشاء عنصر جذر للشجرة التي سيكون لها مؤشر لنفسها. للقيام بذلك ، استخدم المشغل الجديد وقم بتعيين مؤشره إلى المتغير الجديد:

  1. مفهوم شجرة التسلسل الهرمي
  2. أمثلة الاستخدام
  3. هيكل البيانات لتمثيل الشجرة
  4. إنشاء شجرة باستخدام المؤشرات
  5. ملامح العمل مع شجرة في ج
  6. 1. تعريف وهيكل الشجرة
  7. 2. إنشاء شجرة
  8. 3. اجتياز الشجرة
  9. 4. عمليات الشجرة الأساسية
  10. 5. استخدام شجرة في البرمجة
  11. إضافة عنصر جديد
  12. البحث عن عنصر
  13. حذف عنصر
  14. سؤال وجواب
  15. ما بناء الجملة يجب أن تستخدم لإنشاء شجرة التسلسل الهرمي في ج?
  16. كيف يمكنني إضافة عقدة جديدة إلى شجرة التسلسل الهرمي في ج?
  17. كيفية تجاوز شجرة التسلسل الهرمي في ج?
  18. كيف يمكنني إزالة عقدة من شجرة التسلسل الهرمي في ج?
  19. كيف يمكنني التحقق من وجود عقدة في شجرة التسلسل الهرمي في ج?

مفهوم شجرة التسلسل الهرمي

شجرة التسلسل الهرمي هي بنية بيانات مجردة تمثل مجموعة من العقد المتصلة بعلاقة بين الوالدين والطفل. وهو يعكس العلاقة بين الخاص والعامة والوالد والطفل.

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

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

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

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

تتيح لك البرمجة باستخدام شجرة التسلسل الهرمي إنشاء تطبيقات فعالة وقابلة للتطوير تتطلب تنظيم ومعالجة كميات كبيرة من البيانات المنظمة.

أمثلة الاستخدام

تستخدم أشجار التسلسل الهرمي على نطاق واسع في البرمجة لتنظيم هياكل البيانات. دعونا نلقي نظرة على بعض الأمثلة على تطبيقها:

  1. نظام الملفات:

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

  2. تنظيم البيانات:

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

  3. خوارزميات البحث والفرز:

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

  4. إنشاء بنية القائمة:

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

هيكل البيانات لتمثيل الشجرة

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

كل عقدة من الشجرة هي بنية تحتوي على معلومات حول قيمة العقدة وروابط إلى العقد التابعة لها. عادة ما يعتمد هذا الهيكل على استخدام المؤشرات.

مثال على شجرة

بنية العقدة: عقدة البنية {

قيمة كثافة العمليات;

عقدة البنية * اليسار;

عقدة البنية * حق;

};

كما ترون من المثال ، تحتوي كل عقدة على قيمة إنت واثنين من الإشارات إلى العقد الفرعية من نوع "المؤشر إلى بنية العقدة". العقد التي لا تحتوي على عقد فرعية لها قيم فارغة في المؤشرات المقابلة لها.

تسمح لك بنية العقدة هذه بإنشاء هياكل هرمية بعدد عشوائي من المستويات والعقد الفرعية.

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

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

إنشاء شجرة باستخدام المؤشرات

في ج ، يمكنك إنشاء شجرة التسلسل الهرمي باستخدام المؤشرات. الشجرة في البرمجة هي بنية بيانات تتكون من عقد متصلة ببعضها البعض بواسطة علاقة بين الوالدين والطفل.

لإنشاء شجرة باستخدام المؤشرات ، يمكنك استخدام بنية بيانات نسميها "عقدة" أو "عقدة". تحتوي العقدة على بعض القيمة (على سبيل المثال ، رقم أو سلسلة) ومؤشر لأحفادها (اليسار واليمين).

هنا مثال على إعلان بنية لعقدة شجرة:

عقدة البنية {

قيمة كثافة العمليات;

عقدة البنية * اليسار;

عقدة البنية * حق;

};

لإنشاء شجرة ، تحتاج إلى إعلان مؤشر إلى جذر الشجرة ثم إضافة عقد جديدة تدريجيا.

Вот пример создания дерева с тремя узлами:

// Создание корневого узла

struct Node* root = (struct Node*) malloc(sizeof(struct Node));

root->value = 1;

root->left = NULL;

root->right = NULL;

// Создание левого узла

struct Node* leftNode = (struct Node*) malloc(sizeof(struct Node));

leftNode->value = 2;

leftNode->left = NULL;

leftNode->right = NULL;

// Создание правого узла

struct Node* rightNode = (struct Node*) malloc(sizeof(struct Node));

rightNode->value = 3;

rightNode->left = NULL;

العقدة اليمنى- > اليمين = فارغ;

// وضع مؤشرات للأحفاد

الجذر - > اليسار = اليسار;

الجذر - > اليمين = العقدة اليمنى;

لذلك قمنا بإنشاء شجرة مع عقدة الجذر مع قيمة 1 ، الطفل الأيسر مع قيمة 2 والطفل الصحيح مع قيمة 3.

يمكن المرور عبر جميع عقد الشجرة باستخدام وظيفة متكررة. في ما يلي مثال على هذه الوظيفة التي تخرج قيم العقد بالترتيب الذي يتم اجتيازه به:

اجتياز الفراغ (عقدة البنية* العقدة) {

إذا (عقدة == فارغة) {

العودة;

}

برينتف ("٪د " ، العقدة- > القيمة);

اجتياز (عقدة - > يسار);

اجتياز (عقدة - > يمين);

}

إخراج قيم العقدة في ترتيب اجتياز: 1 2 3.

يعد إنشاء شجرة باستخدام المؤشرات إحدى الطرق الأساسية للعمل مع الأشجار في ج. يسمح لك بتخزين ومعالجة هياكل البيانات الهرمية بكفاءة.

ملامح العمل مع الخشب في ج

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

1. تعريف وهيكل الشجرة

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

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

2. إنشاء شجرة

لإنشاء شجرة في ج ، اتبع الخطوات التالية:

  1. حدد بنية عقدة الشجرة باستخدام بنية أو نوع.
  2. قم بإنشاء العقدة الجذرية للشجرة باستخدام تخصيص الذاكرة.
  3. إنشاء العقد الفرعية وتعيين روابط لهم في العقد الأصل.

لتعيين روابط إلى العقد الفرعية في العقدة الأصل ، يمكنك استخدام المؤشرات أو فهارس الصفيف ، اعتمادا على الطريقة المختارة لتنفيذ الشجرة.

3. اجتياز الشجرة

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

يبدأ العبور الأمامي (الطلب المسبق) من عقدة الجذر ، ثم تتم زيارة كل طفل يسار ، ثم الطفل الأيمن.

يبدأ الطلب اللاحق بزيارة كل طفل يسار ، ثم الطفل الأيمن ، وأخيرا عقدة الجذر.

يبدأ اجتياز متماثل بالترتيب بزيارة الطفل الأيسر ، ثم عقدة الجذر ، وأخيرا الطفل الأيمن.

4. عمليات الشجرة الأساسية

تشمل العمليات التي يمكن إجراؤها باستخدام شجرة ما يلي:

  • إضافة عقدة-إنشاء عقدة جديدة وتعيين الروابط بين العقد.
  • يؤدي حذف العقدة إلى تحرير الذاكرة وإعداد الروابط بين العقد.
  • بحث العقدة-ابحث عن عقدة حسب القيمة أو المفتاح.
  • تغيير العقدة-تغيير بيانات العقدة.

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

5. استخدام شجرة في البرمجة

غالبا ما تستخدم الأشجار لنمذجة العلاقات الهرمية في البرمجة. تستخدم على نطاق واسع في قواعد البيانات وهياكل الشبكات والواجهات الرسومية والعديد من مجالات البرمجة الأخرى.

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

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

إضافة عنصر جديد

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

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

من أجل الوضوح ، يمكنك تمثيل شجرة التسلسل الهرمي في شكل جدول:

العنصر الرئيسيأحفاد
الركن 1
  • الركن 2
الركن 3
  • الركن 4
  • الركن 5

لنفترض أنك بحاجة إلى إضافة عنصر جديد "العنصر 6 "باعتباره سليل"العنصر 3". للقيام بذلك ، يمكنك القيام بما يلي:

  1. حدد "العنصر 3" كعنصر الأصل.
  2. إنشاء عنصر جديد "العنصر 6".
  3. تحديد موضع " العنصر 6 "في قائمة أحفاد"العنصر 3".
  4. تحديث الروابط بين "العنصر 3"و" العنصر 6".

بعد إضافة عنصر جديد ، سيبدو الجدول كما يلي:

العنصر الرئيسيأحفاد
الركن 1
  • الركن 2
الركن 3
  • الركن 4
  • الركن 5
  • الركن 6

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

البحث عن عنصر

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

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

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

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

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

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

حذف عنصر

لإزالة عنصر من شجرة التسلسل الهرمي في ج ، اتبع الخطوات التالية:

  1. ابحث عن العنصر المراد حذفه في الشجرة. يمكن القيام بذلك عن طريق عبور الشجرة بعمق أو عرض.
  2. قم بإزالة العنصر الذي تم العثور عليه من العنصر الأصلي. للقيام بذلك ، تحتاج إلى إعداد روابط للعنصر الأصل وإزالة الارتباط بالعنصر المحذوف من قائمة العناصر الفرعية للعنصر الأصل.
  3. Удалить найденный элемент и освободить память, занимаемую данным элементом.

Пример кода удаления элемента из дерева иерархии:

#include

#include

struct Node {

int data;

struct Node* parent;

struct Node* children[10];

int childCount;

};

void deleteNode(struct Node* root, struct Node* nodeToDelete) {

// Находим родительский элемент

struct Node* parent = nodeToDelete->parent;

// Удаляем ссылку на удаляемый элемент из списка дочерних элементов родителя

for (int i = 0; i childCount; i++) {

if (parent->children[i] == nodeToDelete) {

for (int j = i; j childCount - 1; j++) {

parent->children[j] = parent->children[j + 1];

}

break;

}

}

parent->childCount--;

// Освобождаем память

free(nodeToDelete);

}

int main() {

// Создаем дерево с элементами

struct Node* root = (struct Node*)malloc(sizeof(struct Node));

root->data = 1;

root->parent = NULL;

root->childCount = 3;

عقدة البنية * الطفل 1 = (عقدة البنية*) مالوك (حجم (عقدة البنية));

طفل 1 - > البيانات = 2;

الطفل 1- > الوالد = الجذر;

الجذر- > الأطفال [0] = الطفل 1;

عقدة البنية * الطفل 2 = (عقدة البنية*) مالوك (حجم (عقدة البنية));

الطفل 2 - > البيانات = 3;

الطفل 2- > الوالد = الجذر;

الجذر- > الأطفال [1] = الطفل 2;

عقدة البنية * الحفيد = (عقدة البنية*) مالوك (حجم (عقدة البنية));

حفيد - > البيانات = 4;

الحفيد- > الوالد = الطفل 1;

طفل 1- > أطفال [0] = حفيد;

طفل 1- > عدد الأطفال = 1;

// Удаляем элемент из дерева

ديليتنود (الجذر ، الطفل 2);

العودة 0;

}

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

سؤال وجواب

ما بناء الجملة يجب أن تستخدم لإنشاء شجرة التسلسل الهرمي في ج?

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

كيف يمكنني إضافة عقدة جديدة إلى شجرة التسلسل الهرمي في ج?

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

كيفية تجاوز شجرة التسلسل الهرمي في ج?

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

كيف يمكنني إزالة عقدة من شجرة التسلسل الهرمي في ج?

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

كيف يمكنني التحقق من وجود عقدة في شجرة التسلسل الهرمي في ج?

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