家谱中的循环:如何检测并防止无效连接?
大家好!我正在用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+人)上非常慢。也许有某种标准算法或模式适用于这种情况?需要检测能够生效。