عمليات الاجتياز
اجتياز بالترتيب وسبق الترتيب ولاحق الترتيب
عمليات الاجتياز درس مجاني في C Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C Academy 4 دروس في المجموع.
ما المقصود بالاجتياز؟
الاجتياز هو طريقة منهجية لزيارة كل عقدة في شجرة مرة واحدة بالضبط.
الترتيبات الثلاثة الكلاسيكية للاجتياز بالعمق هي: الترتيب الوسطي، والترتيب القبلي، والترتيب البعدي. ولا تختلف إلا في وقت معالجة العقدة الحالية بالنسبة إلى أشجارها الفرعية.
الاجتياز بالترتيب الوسطي
يزور الاجتياز بالترتيب الوسطي الشجرة الفرعية اليسرى، ثم العقدة، ثم الشجرة الفرعية اليمنى.
في BST، يطبع هذا الاجتياز القيم بترتيب تصاعدي، ما يجعله الاجتياز الأكثر فائدة لأشجار البحث.
void in_order(Node *root) {
if (root == NULL) return;
in_order(root->left);
printf("%d ", root->value);
in_order(root->right);
}الاجتياز بالترتيب القبلي
يزور الاجتياز بالترتيب القبلي العقدة أولًا، ثم الشجرة الفرعية اليسرى، ثم الشجرة الفرعية اليمنى.
يفيد هذا الاجتياز في نسخ شجرة أو إنشاء تعبير بترتيق بادئة، لأن الجذر يُخرج قبل أبنائه.
void pre_order(Node *root) {
if (root == NULL) return;
printf("%d ", root->value);
pre_order(root->left);
pre_order(root->right);
}الاجتياز بالترتيب البعدي
يزور الاجتياز بالترتيب البعدي الشجرتين الفرعيتين أولًا، ثم يزور العقدة أخيرًا.
وبما أن الأبناء تُعالج قبل أبيها، فهذا الترتيب هو ما تحتاجه بالضبط لتحرير شجرة، إذ لا تُستخدم عقدة بعد زوال أبنائها.
void post_order(Node *root) {
if (root == NULL) return;
post_order(root->left);
post_order(root->right);
printf("%d ", root->value);
}النمط المشترك
تشترك اجتيازات العمق الثلاثة في الهيكل نفسه: حالة أساسية هي NULL، واستدعاء تكراري للابن الأيسر، واستدعاء تكراري للابن الأيمن، وخطوة زيارة.
ولا يحدد اسم الترتيب إلا موضع خطوة الزيارة.
/* visit position decides the order:
* pre : VISIT, left, right
* in : left, VISIT, right
* post : left, right, VISIT
*/الترتيب الوسطي يطبع القيم المرتبة
ينشئ هذا البرنامج BST صغيرة وينفذ اجتيازًا بالترتيب الوسطي، موضحًا خاصية إخراج القيم المرتبة.
تظهر القيم من الأصغر إلى الأكبر بغض النظر عن ترتيب الإدراج.
#include <stdio.h>
#include <stdlib.h>
typedef struct Node { int value; struct Node *left, *right; } Node;
Node *cn(int v){ Node *n=malloc(sizeof(Node)); n->value=v; n->left=n->right=NULL; return n; }
Node *insert(Node *r,int v){
if(!r) return cn(v);
if(v<r->value) r->left=insert(r->left,v);
else if(v>r->value) r->right=insert(r->right,v);
return r;
}
void in_order(Node *r){ if(!r) return; in_order(r->left); printf("%d ", r->value); in_order(r->right); }
int main(void){
Node *root=NULL;
int d[]={10,5,15,3,7,12};
for(int i=0;i<6;i++) root=insert(root,d[i]);
in_order(root);
printf("\n");
return 0;
}مقارنة الترتيبات الثلاثة
بالنسبة إلى شجرة جذرها 10، وابنها الأيسر 5، وابنها الأيمن 15، تختلف المخرجات:
يعطي الترتيب القبلي 10 5 15. ويعطي الترتيب الوسطي 5 10 15. ويعطي الترتيب البعدي 5 15 10. قيم العقد هي نفسها؛ وما يتغير فقط هو توقيت الزيارة.
/* 10
* / \
* 5 15
* pre : 10 5 15
* in : 5 10 15
* post: 5 15 10
*/الاجتياز حسب المستوى
يزور الاجتياز بالعرض، أو الاجتياز حسب المستوى، العقد مستوى تلو الآخر من الأعلى إلى الأسفل. وهو ليس تكراريًا بطبيعته؛ بل يستخدم طابورًا.
نضيف الجذر إلى الطابور، ثم نزيل عقدة منه بشكل متكرر، ونطبعها، ونضيف أبناءها إلى الطابور.
void level_order(Node *root) {
if (!root) return;
Node *queue[100];
int head = 0, tail = 0;
queue[tail++] = root;
while (head < tail) {
Node *n = queue[head++];
printf("%d ", n->value);
if (n->left) queue[tail++] = n->left;
if (n->right) queue[tail++] = n->right;
}
}الاجتياز ينفذ الأعمال الفعلية
الاجتيازات قوالب لأي عملية يجب أن تلمس كل عقدة، وليس للطباعة فقط.
استبدل خطوة الزيارة بجمع القيم أو العثور على قيمة قصوى أو نسخ العقد، وسيؤدي الهيكل نفسه المهمة.
int sum_tree(Node *root) {
if (root == NULL) return 0;
return root->value
+ sum_tree(root->left)
+ sum_tree(root->right);
}تكلفة الاجتياز
يزور كل اجتياز كل عقدة مرة واحدة، لذلك يعمل في زمن يتناسب مع n، أي عدد العقد.
تستخدم التكرارية مساحة مكدس تتناسب مع ارتفاع الشجرة، ويكون هذا الارتفاع log(n) عندما تكون الشجرة متوازنة، وn في أسوأ الحالات.
الترتيبات الثلاثة معًا
يطبع هذا البرنامج الترتيب القبلي والوسطي والبعدي للشجرة نفسها، كي تتمكن من مقارنتها جنبًا إلى جنب.
لاحظ كيف يؤدي تغيير موضع استدعاء الطباعة وحده إلى تغيير التسلسل الناتج.
#include <stdio.h>
#include <stdlib.h>
typedef struct Node { int value; struct Node *left, *right; } Node;
Node *cn(int v){ Node *n=malloc(sizeof(Node)); n->value=v; n->left=n->right=NULL; return n; }
void pre(Node *r){ if(!r) return; printf("%d ", r->value); pre(r->left); pre(r->right); }
void ino(Node *r){ if(!r) return; ino(r->left); printf("%d ", r->value); ino(r->right); }
void post(Node *r){ if(!r) return; post(r->left); post(r->right); printf("%d ", r->value); }
int main(void){
Node *root = cn(10);
root->left = cn(5); root->right = cn(15);
pre(root); printf("\n");
ino(root); printf("\n");
post(root); printf("\n");
return 0;
}تحقق سريع
اختر الاجتياز المناسب للمهمة.
مراجعة
تشترك اجتيا�ات العمق في هيكل تكراري واحد؛ ويحدد موضع خطوة الزيارة ما إذا كان الاجتياز قبليًا أو وسطيًا أو بعديًا. ويعطي الاجتياز الوسطي في BST مخرجات مرتبة، بينما يُعد الترتيب البعدي الترتيب الآمن للتحرير.
الاجتياز حسب المستوى هو اجتياز بالعرض ويستخدم طابورًا. وتزور جميع هذه الاجتيا�ات كل عقدة مرة واحدة في زمن O(n).
الأسئلة الشائعة
هل درس «عمليات الاجتياز» مجاني؟
نعم — نص درس «عمليات الاجتياز» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C Academy 4 دروس في المجموع.
ماذا ستتعلم في «عمليات الاجتياز»؟
اجتياز بالترتيب وسبق الترتيب ولاحق الترتيب تتمرن على C Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C Academy؟
لا تُشترط خبرة سابقة. C Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «عمليات الاجتياز»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C Academy هذا؟
نعم. كل درس في C Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- عُقد الشجرة وبنيتها
- الإدراج في BST
- عمليات الاجتياز
- البحث والتحرير