الدورات في شجرة العائلة: كيفية اكتشاف ومنع الروابط غير الصحيحة؟
مرحباً بالجميع! أكتب برنامجاً لبناء شجرة عائلة بلغة 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+ شخص) يكون ذلك بطيئاً جداً. هل هناك خوارزمية قياسية أو نمط لمثل هذه الحالات؟ أحتاج إلى أن يعمل الفحص