Обычно лучший способ сделать это - поиск в глубину (DFS).Начните с корневого узла, отметьте его как «посещенный» и начните следовать указателям.На каждом новом узле, который вы достигнете, пометьте его как «посещенный».Если вы зашли в тупик, сделайте резервную копию и попробуйте другой путь.
Если вы когда-нибудь пойдете по указателю и достигнете узла, который вы уже пометили как посещенный, то у вас есть цикл.
Как насчет того, чтобы сделать это рекурсивно:
struct node {
struct node *left;
struct node *right;
bool visited;
};
bool check_tree(struct node *cur)
{
if (cur == NULL)
return true;
if (cur->visited)
return false; // uh oh. We've been here...
cur->visited = true;
return check_tree(cur->left)
&& check_tree(cur->right);
}
if (check_tree(&root))
printf("No self-references here.\n");
(предупреждение: код может содержать ошибки)