برامج

دالة الحذف مااشتغلت ببرنامجي ممكن مساعدة [الأرشيف] - برامج نت

المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : دالة الحذف مااشتغلت ببرنامجي ممكن مساعدة


عزتي في حجابي
05-15-2006, 12:09 PM
السلام عليكم ورحمة الله وبركاته

عندي برنااااامج عن الاشجار (tree)

وكتبت البرنامج وتنفذ معي

لكن دلة remove ماتحذف الا الجذور اما الاب ماتحذفه

هو ضابظ معي بس ابي احد يساعدني على تعديل بسيط بدالة الحذف

ولكم مني جزيل الشكرررر

#include<iostream.h>

struct tree_node

{

int data;
tree_node *left;
tree_node *right;
};
//------------------------------

tree_node *t;

void creat();

void insert(int a,tree_node *&t);

int find_min(tree_node *t);

tree_node *find_element(int b,tree_node *&t);

void remove(int x,tree_node *&t);

void print(tree_node *t);

//----------------------------------

void creat()

{

t=NULL;

}

//-------------------------------

void insert(int a,tree_node *&t)

{

if(t == NULL)

{

t = new tree_node;

t->data = a;

t->left=NULL;

t->right=NULL;
}
else
{

if(a==t->data)

cout<<"can not insert ";

if(t->data > a)

insert(a,t->left);

if(t->data < a)

insert(a,t->right);
}
}

//-------------------------------

int find_min(tree_node *t)

{
tree_node *p = t;

if(p!=NULL)

{
while(p->left != NULL)

{

p=p->left;

}

return p->data;

}

else

cout<<" it is empty ";
}

//-----------------------------------------


tree_node *find_element(int b,tree_node *&t)

{

if(t == NULL)

return NULL;

else

{
if(t->data==b)

return t;

tree_node *a = t;

while(a != NULL && a->data != b)

{
if(t->data > b)

a = a->left;

if(t->data < b)

a= a->right;

}

return a;

}
}

//----------------------------------

void remove(int x,tree_node *&t)



{
if(t==NULL)

cout<<"\n"<<"empty ";

else

if(x<t->data)

remove(x,t->left);

else

if( x > t->data)

remove(x,t->right);

else

{

if(t->left!=NULL && t->right!=NULL)

{

t->data= find_min(t->right);

remove(x,t->right);

}

else

{

tree_node *p = t;

t = (t->left != NULL)?t->left:t->right;

delete p;

}
}


}

//---------------------------------------------

void print(tree_node *t)
{

if(t!= NULL)

{
cout<<"(";

print(t->left);

print(t->right);

cout<<t->data;

cout<<")";
}

}

//----------------------------------------------
void main()
{


cout<<"1-insert \n2-find_min \n3-find_element \n4- remove \n5-print \n";

creat();

int w=1;

int b;

tree_node *c;

while(w!=0)

{
cin>>w;

if(w==1)

{
cout<<"value=";

cin>>b;

insert(b,t);


}

else

if(w==2)

{
cout<<"min value =";

b=find_min(t);

cout<<b;
}

else if(w==3)

{
cout<<"value find = ";

cin>>b;

c=find_element(b,t);

cout<<c;
}
else

if(w==4)

{
cout<<"delete value= ";

cin>>b;

remove(b,t);



}

else

if(w==5)

{
cout<<" ( ";

print(t);

cout<<" ) ";

cout<<"\n";
}
}
}

hamza_delphi
05-16-2006, 10:34 PM
و الله يا أختي دالة الحذف ناقصة و ممو ممكن تشتغل بالشكل هذا بس
المشكلة بالمفهوم
لأني زي ما شفت الشجرة دي هي arbre binaire de recherche
يعني يكون الاب أكبر من الابن الايسر و يكون الاب أصغر من الابن الايمن
و هون المشكلة
حين حذف أي عقدة من الشجرة لازم نعوضها بأحد الابنين *الايسر أم الايمن *
و حين يتم التعويض قادر يكون الابن المعوض به هو أيضا أب لأثنين كيف الحل
أعطيني الفرضية في هيك مشكلة و انا ان شاء الله بساعدك في البرنامج
اللهم صل على سيدنا و حبيبنا و شفيعنا طب القلوب و دواءها حبيبنا محمد عليه أفضل الصلاة و أزكى التسليم

hamza_delphi
05-16-2006, 10:40 PM
بالنسبة للدالة
tree_node *find_element(int b,tree_node *&t)

تكون أحسن بالشكل الاتي

tree_node *find_element(int b,tree_node *&t)

{

if(t == NULL)

return NULL;

else

{
if(t->data==b)

return t;

else
{
if if(t->data>b
return find_element(b,t->left);
else return find_element(b,t->reight);

}



}

و هيك الحل يكون أحسن