Это можно сделать простым обходом дерева, используя атрибут флага visited
(в основном, bool
переменная-член).
Сначала у вас есть обход, где вы очищаете visited
флаг. Затем вы делаете вторую проверку, установлен ли флаг visited
для узла. Если это не так, вы устанавливаете его, иначе вы сообщаете о al oop.
. В псевдокоде это может выглядеть примерно так:
void check_loop(tree_node* const root)
{
if (root->visited)
{
// You have a loop, report it
}
else
{
root->visited = true;
// Traverse to children
if (root->left)
{
check_loop(root->left);
}
if (root->right)
{
check_loop(root->right);
}
}
}
В моем примере выше Обход поддерева останавливается после того, как вы нашли al oop.
. Он проверит все узлы дерева, внутренние и конечные узлы, а также перехватит сложные петли, а не только прямые, как вы видите.