السلام عليكم...جزاك الله خيرا أستاذ محمد على الشرح المبسط...أين ممكن أجد درس Recursion اللي تكلمت عليه في الفيديو...بحثت عليه في قائمة دروس c++ لكن ماوجدت...شكرا جزيلا
دكتور لو سمحت أعتقد أن في خطأ بسيط في الكود بتاع الInsert function الأولى اللي عملنا لها overloading لما نيجي نطبع محتوى الtree بعد ما عملنا Insert للقيم باستخدام الطريقة الأولى لما بنباصي item & root مفيش حاجة بتنطبع ودا معناه أن الroot لسه قيمته NULL لكن الfunction التانية اللي الباراميتر بتاعهاهو item بس شغالة عادي كدا المفروض نباصي الroot by reference مش by value ؟ وحابب أشكر حضرتك جدا لأنك كنت أحد الأسباب اللي خلتني أبدأ اتعلم برمجة وبدأت كورساتك من شهرين الأساسيات والOOP ودلوقتي الdata structures وكل حاجة تقريبا كنت محتاجها بلاقيها هنا Node* Insert(Node*& r, int item) {//here we must pass the pointer by reference not by value so that the pointer value gets actually updated if (r == NULL) { Node* newnode = new Node(item); r = newnode; } else if (item < r->data) r->left = Insert(r->left, item); else r->right = Insert(r->right, item); return r; } void Insert(int item) { root = Insert(root, item); /* here it doesn't matter whether or not the original Insert function that's being overloaded works with the pointer passed by reference or by value because we explicitly assign a new value to the root by writing root= Insert(root,item); which means the original Insert func works with the value of root but eventually the root gets assigned the new updated value which just being stored locally inside the scope of the original Insert func */ }
يعطيك الف عافية دكتور ... لو سمحت شو لازمة الطرف اليساري من المعادلة في السطر 40 ؟؟ ما دام نحنا أساسا في الحالة الأولى أسندنا العقدة الجديدة إلى المؤشر المدخل للدالة insert ??
اذا كنت تقصد الحالة الأولى التي في السطر 31: ففي السطر ال 31 جعل الجذر الأساسي يساوي العقدة الجديدة لأن الشجرة كانت فارغة لكن في السطر 40 كانت الشجرة ممتلئة فتم تحديد موقع العقدة الجديدة على يمين الجذر, لأن العقدة الجديدة اكبر من الجذر أي انك في السطر 40 أنت بحاجة تحديد مكان وضعها بالنسبة للجذر سواء كان basic root أو sub root
مهندس سؤال ياريت تجاوب عليه ال else if (item < r->data) r->left = Insert(r->left, item); بحالة ال ريكيرجن بالزبط اي edge او اي بوينتر في كل مره بأشر على النود
Program code
#include
using namespace std;
class Node
{
public:
int data;
Node* left, * right;
Node(int value)
{
data = value;
left = right = NULL;
}
};
class BST
{
public:
Node* root;
BST()
{
root = NULL;
}
Node* Insert(Node* r, int item)
{
if (r == NULL)
{
Node* newnode = new Node(item);
r = newnode;
}
else if (item < r->data)
r->left = Insert(r->left, item);
else
r->right= Insert(r->right, item);
return r;
}
void Insert(int item)
{
root= Insert(root, item);
}
void Preorder(Node* r) // root ->left->right
{
if (r == NULL)
return;
cout data left);
Preorder(r->right);
}
void Inorder(Node* r) // left->root -> right
{
if (r == NULL)
return;
Inorder(r->left);
cout data right);
}
void Postorder(Node* r) // left--> right->root
{
if (r == NULL)
return;
Postorder(r->left);
Postorder(r->right);
cout data data == key)
return r;
else if (key < r->data)
return Search(r->left, key);
else
return Search(r->right, key);
}
bool Search(int key)
{
Node* result = Search(root, key);
if (result == NULL)
return false;
else
return true;
}
Node* Findmin(Node* r)
{
if (r == NULL)
return NULL;
else if (r->left == NULL)
return r;
else
return Findmin(r->left);
}
Node* Findmax(Node* r)
{
if (r == NULL)
return NULL;
else if (r->right == NULL)
return r;
else
return Findmax(r->right);
}
Node* Delete(Node* r, int key)
{
if (r == NULL) // Empty Tree
return NULL;
if (key < r->data) // Item exists in left sub tree
r->left = Delete(r->left, key);
else if (key > r->data) // item exists in right sub tree
r->right =Delete(r->right, key);
else
{
if (r->left == NULL && r->right == NULL) // leaf node
r = NULL;
else if (r->left != NULL && r->right == NULL) // one child on the left
{
r->data = r->left->data;
delete r->left;
r->left = NULL;
}
else if (r->left == NULL && r->right != NULL) // one child on the right
{
r->data = r->right->data;
delete r->right;
r->right = NULL;
}
else
{
Node* max = Findmax(r->left);
r->data = max->data;
r->left= Delete(r->left, max->data);
}
}
return r;
}
};
int main()
{
//45, 15, 79, 90, 10, 55, 12, 20, 50
BST btree;
btree.Insert(45);
btree.Insert(15);
btree.Insert(79);
btree.Insert(90);
btree.Insert(10);
btree.Insert(55);
btree.Insert(12);
btree.Insert(20);
btree.Insert(50);
cout
استاذ هذا الفيديو شرح intالارقام
استاذ واذا طلب منا بلسؤال عنchar اوstring
كيف يتم ذلك؟من حيث ا لمقارنه الاكبر اليمين والاصغراليسار؟
صعب
@@مسلمحيدر-ط7س أعتقد هتجيب الأسكي كود بتاع الحرف
@@مسلمحيدر-ط7س
ASCII
اتمني من حضرتك تكمل السلسله دي
جزاك الله خيرا و طريقة تعليمك الممتازة
الله يرضى عليك يا رب
الشرح جميل اوى
اسٌتاذ محمد ممتاز شرحك👍
جزاك الله خيرا
تسلم
لايك قبل ما اتفرج 🤍🤍
عاشت الايادي ❤❤❤
السلام عليكم...جزاك الله خيرا أستاذ محمد على الشرح المبسط...أين ممكن أجد درس Recursion اللي تكلمت عليه في الفيديو...بحثت عليه في قائمة دروس c++ لكن ماوجدت...شكرا جزيلا
دكتور لو سمحت أعتقد أن في خطأ بسيط في الكود بتاع الInsert function الأولى اللي عملنا لها overloading
لما نيجي نطبع محتوى الtree بعد ما عملنا Insert للقيم باستخدام الطريقة الأولى لما بنباصي item & root مفيش حاجة بتنطبع ودا معناه أن الroot لسه قيمته NULL
لكن الfunction التانية اللي الباراميتر بتاعهاهو item بس شغالة عادي
كدا المفروض نباصي الroot by reference مش by value ؟
وحابب أشكر حضرتك جدا لأنك كنت أحد الأسباب اللي خلتني أبدأ اتعلم برمجة وبدأت كورساتك من شهرين الأساسيات والOOP ودلوقتي الdata structures وكل حاجة تقريبا كنت محتاجها بلاقيها هنا
Node* Insert(Node*& r, int item)
{//here we must pass the pointer by reference not by value so that the pointer value gets actually updated
if (r == NULL)
{
Node* newnode = new Node(item);
r = newnode;
}
else if (item < r->data)
r->left = Insert(r->left, item);
else
r->right = Insert(r->right, item);
return r;
}
void Insert(int item)
{
root = Insert(root, item);
/*
here it doesn't matter whether or not the original Insert function that's being overloaded works with the pointer passed by reference or by value
because we explicitly assign a new value to the root by writing root= Insert(root,item); which means the original Insert func works with the value of root
but eventually the root gets assigned the new updated value which just being stored locally inside the scope of the original Insert func
*/
}
طب لو كان input string data type who do compare
يعطيك الف عافية دكتور ... لو سمحت شو لازمة الطرف اليساري من المعادلة في السطر 40 ؟؟ ما دام نحنا أساسا في الحالة الأولى أسندنا العقدة الجديدة إلى المؤشر المدخل للدالة insert ??
عرفت الإجابة؟
اذا كنت تقصد الحالة الأولى التي في السطر 31:
ففي السطر ال 31 جعل الجذر الأساسي يساوي العقدة الجديدة لأن الشجرة كانت فارغة
لكن في السطر 40 كانت الشجرة ممتلئة فتم تحديد موقع العقدة الجديدة على يمين الجذر, لأن العقدة الجديدة اكبر من الجذر
أي انك في السطر 40 أنت بحاجة تحديد مكان وضعها بالنسبة للجذر سواء كان basic root
أو sub root
لو سمحت يا دكتور ممكن لينك الفيديو اللي حضرتك شارح فيه ال recursion
ياريت لإني لا أتذكر إنه شرحه
هو كده الكورس كامل ولا لا ؟ لو اى حد يفيدني
مهندس سؤال ياريت تجاوب عليه
ال
else if (item < r->data)
r->left = Insert(r->left, item);
بحالة ال ريكيرجن بالزبط اي edge او اي بوينتر في كل مره بأشر على النود
يعني اي r->left الي حيأشر على النود
ممكن رابط function recursion
ياريت والله 😊
هذا كل شيء في data structure?
لا طبعاااا بس مش عارفة ليه مش شترح كل حاجة
ممكن رابط مباشر لدرس الrecursion ما لقيتو بالقناة
تلكاه بموضوع الدوال
19:39 / 50:33
ليه الشرح مش مبسط زي شرح اللينكد