#algorithm #data-structures
Вопрос:
Я был на техническом собеседовании, и один из интервьюеров спросил меня
Какой тип поиска вы бы использовали для сканирования несбалансированного двоичного дерева?
и я не мог ответить, не мог бы кто-нибудь помочь мне с этим ответом для будущих интервью?
Комментарии:
1. Вы уверены, что это был тот самый вопрос?
2. да, вот в чем был вопрос
Ответ №1:
Я полагаю, что интервьюер уловил важное различие в том, какие алгоритмы подходят для обхода сбалансированных и несбалансированных деревьев.
Когда известно, что дерево не сбалансировано, становится нецелесообразным пересекать его с помощью рекурсивного DFS, поскольку оно может занимать O(N) места в стеке. Стопки намного меньше кучи, и пространство в стеке слишком ценно, чтобы тратить его таким образом.
По этой причине вы обычно используете BFS или DFS с явным стеком, если хотите пересечь несбалансированное дерево. Вы также можете использовать обход по порядку, опять же с явным стеком, если в дереве нет родительских указателей.
Обратите внимание, что этот вопрос, по-видимому, не имеет никакого смысла, поскольку обход и поиск-это разные вещи, но мой ответ заключается в том, чтобы использовать «поиск» для обхода. Если вы начнете с ответа в уме, вы можете в конечном итоге задать вопрос таким образом.
Комментарии:
1. Спасибо за ответ, я обновил вопрос, чтобы придать ему больше смысла
2. Нет необходимости использовать «явный стек». Просто замените рекурсию итерацией, когда у узла есть только один дочерний элемент.
3. @valdo, это не работает. Если у каждого внутреннего узла есть 2 дочерних узла, вы все равно можете достичь глубины N/2.
4. @MattTimmermans: пока внутренние узлы имеют 2 дочерних элемента, дерево сбалансировано, и нет проблем с рекурсивным пересечением
5. @valdo представьте, что каждый правый ребенок-это лист, а каждый левый ребенок-дерево, подобное корню. Не сбалансирован.