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+人)上非常慢。也许有某种标准算法或模式适用于这种情况?需要检测能够生效。