Один из моих любимых вопросов -
В O (n) времени и O (1) пространстве определите, содержит ли связанный список цикл.
Это можно сделать, используя алгоритм поиска циклов Floyd.
Мой вопрос в том, можно ли получить такие хорошие временные и космические гарантии при попытке определить, содержит ли двоичное дерево цикл. То есть, если кто-то дает вам определение struct
в строках
struct node {
node* left;
node* right;
};
Насколько эффективно вы можете проверить, что данная структура действительно представляет собой двоичное дерево, а не, скажем, DAG или график, содержащий цикл?
Есть ли алгоритм, который, учитывая корень двоичного дерева, может определить, содержит ли это дерево цикл в O (n) времени и лучше, чем O (n) пространство? Очевидно, что это можно сделать со стандартным DFS или BFS, но для этого требуется O (n) пространство. Можно ли это сделать в пространстве O (& radic; n)? O (log n)? Или (святой Грааль) только в O (1) пространстве? Мне любопытно, потому что в случае связанного списка это можно сделать в O (1) пространстве, но я никогда не видел соответствующего эффективного алгоритма для этого случая.