Avatar ·

الدورات في شجرة العائلة: كيفية اكتشاف ومنع الروابط غير الصحيحة؟

مرحباً بالجميع! أكتب برنامجاً لبناء شجرة عائلة بلغة C++. واجهت مشكلة عندما يقوم المستخدم بإنشاء دورة في الروابط عن طريق الخطأ (مثل جعل سلفه نسلاً له). هذا يفسد منطق العرض وحساب القرابة. لدي هيكل لعقدة الشجرة: ```cpp struct Person { string name; Person* father; Person* mother; vector children; }; ``` أقوم بإضافة رابط "والد-طفل" عبر دالة: ```cpp void addChild(Person* parent, Person* child) { parent->children.push_back(child); if (child->father == nullptr) child->father = parent; else if (child->mother == nullptr) child->mother = parent; // المشكلة: لا أتحقق من أن child ليس سلفاً لـ parent } ``` كيف يمكن إجراء فحص للدورات؟ جربت مقارنة تكرارية بسيطة، لكن مع شجرة كبيرة (1000+ شخص) يكون ذلك بطيئاً جداً. هل هناك خوارزمية قياسية أو نمط لمثل هذه الحالات؟ أحتاج إلى أن يعمل الفحص