الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

[ تمت الإجابة ]طلب شرح استدعاءات الدوال داخل الأشجار

بدأه طموحة بلا حدود في 11 مايو 2013 · 4 رد · 1,113 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

سلام اخواني ممكن تساعدوني في فهم الاستدعاء الذاتي للاله عند عرض الاشجار في هياكل البيانات بالسي

void show_pre(tree *t)
{if(t != NULL)
{cout<< t->data<<endl;
show_pre(t->left);
show_pre(t->right);
}
}

 

 

 

اريد ان اعرف متي يتوقف الاستدعاء الاول ومتي تدخل في الاستدعاء الثاني وما هي القيمه عند الاستدعاء الثاني  

وهذا هو الكود كامل 

#include<iostream>

using namespace std;

struct tree{
  int data;
  tree *left;
  tree *right;
};

void add(tree *root,int x)
{  tree *node,*p,*t;
   p = root;
   node = new tree;
   node->data = x;
   node->left = NULL;
   node->right = NULL;

   while(p != NULL)
   {
	   t = p;
	   if(x > p->data)
		   p = p->right;
	   else
		   p = p->left;
   }

   if(x > t->data)
	   t->right = node;
   else
	   t->left = node;

}

void show_pre(tree *t)
{if(t != NULL)
  {cout<< t->data<<endl;
   show_pre(t->left);
  show_pre(t->right);
  }

}

int main(){
	tree *node,*root,*temp;
	int x;
root = NULL;
cout<<"enter any number or 0 to stop"<<endl;
do{
cin>>x;
if(root == NULL)
   {
	node = new tree;
    node->data = x;
	node->left = NULL;
	node->right = NULL;
	root = node;
	temp = node;
  }
else 
  {
	  temp = root;
	  add(temp,x);
  }
}while(x != 0);

 temp = root;
 cout<<"elements :"<<endl;
 show_pre(temp);
return 0;
}

كثيــــرووون هــــــــم أولئـكــــــ الـــــــذيـــن يسعــــووون جــــــاهــــــدين مــــن أجـــــل التميـــــز ولكـــــــن!!!!

هيهــــــــات فالقمــــــــة لا تتســـــع إلا لـــــــواحد ومـــــع ذالكــــــــ فلكــــــل مجتهــــــــد نصيــــب

#2

ارجو من يشاهد الموضوع وعنده اي معلومه ان يفيدني 

محتاجه الاجابه جدا في اسرع وقت ربي يجزيكم الفردوس الاعلى

كثيــــرووون هــــــــم أولئـكــــــ الـــــــذيـــن يسعــــووون جــــــاهــــــدين مــــن أجـــــل التميـــــز ولكـــــــن!!!!

هيهــــــــات فالقمــــــــة لا تتســـــع إلا لـــــــواحد ومـــــع ذالكــــــــ فلكــــــل مجتهــــــــد نصيــــب

#3

صراحة المسمى غير الكود حيث أن للشجرة أب وأبناء وليست اليسار واليمين وبهذا الكود تكون List وليست Tree

 

يمكنك تصورها على أنها صف أفراد كل فرد يمسك الذي عن يمينه والذي هن يساره ماعدا الأول في جهة اليمين لا يوجد على يمينه شيء وهو برمجياً NULL والشخص الأخير من جهة اليسار لا يمسك أحد على اليسار أي أن اليسار به NULL والمفترض أن يتوقف التنفيذ عندما يكون العنصر = NULL كما اشترط في الدالة show_pre

 

ولكن الدالة بعد ذلك تتبع سلوك غريب حيث تعرض السابق والتالي وبالتالي أتوقع أنها يمكن لا تنتهي أبداً

 

ويمكنك التأكد من ذلك عن طريق وضع Break point بعد استدعاء الدالة وننظر هل ستصل للسطر التالي الذي به Break point أم لا وأتوقع أنها لن تصل أنا للأسف ماعندي وقت لتجريب الكود ولكن هذا ما أراه أردت أن أفيد به

−1
Electrical communications and electronics engineer

C++ Developer

 


stackoverflow profile : http://stackoverflow.com/users/249120/ahmed-safan


 


Just Keep Moving On , never stop until you are dead


#4
void show_pre(tree *t)
{
    if(t != NULL)
    {
        cout << t->data << endl;

        show_pre(t->left);
        show_pre(t->right);
    }
}

سنفترض وجود الشجرة التالية:

              A
              1
           /     \
          B       C
          2       3
         / \     / \
        D   E   F   G
        4   5   6   7

الحرف يمثل إسم الفرع:

 

خطوات تنفيذ الدالة:

-root call: pass node A

(L1) t=A, print value of t (1)
 |
 |-  execute left node
 |---  (L2) t=C, print value of t (3)
 |      |
 |      |-  execute left node
 |      |---  (L3) t=G, print value of t (7)
 |      |      |
 |      |      |-  execute left node
 |      |      |---  (L4) t=null
 |      |      |
 |      |      |-  execute right node
 |      |      |---  (L4) t=null
 |      |
 |      |-  execute right node
 |      |---  (L3) t=F, print value of t (6)
 |      |      |
 |      |      |-  execute left node
 |      |      |---  (L4) t=null
 |      |      |
 |      |      |-  execute right node
 |      |      |---  (L4) t=null
 |
 |-  execute right node
 |---  (L2) t=B, print value of t (2)
 |      |
 |      |-  execute left node
 |      |---  (L3) t=E, print value of t (5)
 |      |      |
 |      |      |-  execute left node
 |      |      |---  (L4) t=null
 |      |      |
 |      |      |-  execute right node
 |      |      |---  (L4) t=null
 |      |
 |      |-  execute right node
 |      |---  (L3) t=D, print value of t (4)
 |      |      |
 |      |      |-  execute left node
 |      |      |---  (L4) t=null
 |      |      |
 |      |      |-  execute right node
 |      |      |---  (L4) t=null

النتيجة ستكون:

1376254

 

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة C++er في 28 مايو 2013 في 22:52

1

مدونتي: C++ Tips and Tricks

#5

أستاذ أبو هاشم, هذه شجرة! :) و الدالة صحيحة و ستتوقف عند نهاية الشجرة.

 

بعد الشرح الوافى من الأستاذ محمد علاء أظن أنه لا ينقص شئ على المستوى الفنى لفهم طريقة عمل الدالة. لكنى أريد أن أوضح شئ صغير ليساعدك فى فهم الأشجار بشكل عام, الأشجار هى recursive data structure يعنى بالتعريف, الشجرة تتكون من أشجار فرعية, لذلك يكون أفضل طريقة للتعامل معها, فى الغالب, هى دوال الإستدعاء الذاتى. و بالطبع يكون شرط توقف الدالة هو الوصول لآخر نقاط بالشجرة و هى المؤشرات التى تحتوى على (NULL).

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…