несбалансированный поиск по двоичному дереву

#algorithm #data-structures

Вопрос:

Я был на техническом собеседовании, и один из интервьюеров спросил меня

Какой тип поиска вы бы использовали для сканирования несбалансированного двоичного дерева?

и я не мог ответить, не мог бы кто-нибудь помочь мне с этим ответом для будущих интервью?

Комментарии:

1. Вы уверены, что это был тот самый вопрос?

2. да, вот в чем был вопрос

Ответ №1:

Я полагаю, что интервьюер уловил важное различие в том, какие алгоритмы подходят для обхода сбалансированных и несбалансированных деревьев.

Когда известно, что дерево не сбалансировано, становится нецелесообразным пересекать его с помощью рекурсивного DFS, поскольку оно может занимать O(N) места в стеке. Стопки намного меньше кучи, и пространство в стеке слишком ценно, чтобы тратить его таким образом.

По этой причине вы обычно используете BFS или DFS с явным стеком, если хотите пересечь несбалансированное дерево. Вы также можете использовать обход по порядку, опять же с явным стеком, если в дереве нет родительских указателей.

Обратите внимание, что этот вопрос, по-видимому, не имеет никакого смысла, поскольку обход и поиск-это разные вещи, но мой ответ заключается в том, чтобы использовать «поиск» для обхода. Если вы начнете с ответа в уме, вы можете в конечном итоге задать вопрос таким образом.

Комментарии:

1. Спасибо за ответ, я обновил вопрос, чтобы придать ему больше смысла

2. Нет необходимости использовать «явный стек». Просто замените рекурсию итерацией, когда у узла есть только один дочерний элемент.

3. @valdo, это не работает. Если у каждого внутреннего узла есть 2 дочерних узла, вы все равно можете достичь глубины N/2.

4. @MattTimmermans: пока внутренние узлы имеют 2 дочерних элемента, дерево сбалансировано, и нет проблем с рекурсивным пересечением

5. @valdo представьте, что каждый правый ребенок-это лист, а каждый левый ребенок-дерево, подобное корню. Не сбалансирован.