Пусть у меня есть Binary Search Tree
Диапазон запросов - дерево не содержит верхнюю и/или нижнюю границу
50
/ \
17 72
/ \ / \
12 23 54 76
/\ / \
9 14 19 67
К сожалению, я посасывать рисунок деревьев
Я хочу, чтобы вернуть все узлы, которые находятся в пределах определенного ассортимент. Например
[12, 23] --> {12, 14, 17, 23, 19}
Мой подход прост
- Найти LCA
- Найти нижнюю границу
- Хотя узел! = LCA.parent, добавьте правое поддерево
- От LCA, в то время как узел! = верхняя граница, добавить левое поддерево
- Добавить верхнее и левое поддеревье верхней границы
Однако, если одна или обе эти границы НЕ содержатся в дереве. Например,
[11, 72] --> {12, 14, 17, 23, 19, 50, 54, 67, 72}
Мой подход кажется схожим, кроме как для поиска границ, поиск до тех пор, пока ваша граница не будет превышена дочерними узлами. Поэтому, после обнаружения «LCA» (а не истинной LCA, поскольку она не существует), найдите 11. После достижения 12, см., Что левый ребенок меньше 11, поэтому остановитесь там.
- Есть ли более эффективное решение для выполнения этого запроса диапазона? BST не является обязательным, он просто выглядит как хорошая структура данных.
- Будет ли мой подход работать/эффективен ли он, когда границы не содержатся в дереве?
Почему вы заботитесь о LCA? Просто начинайте с корня и рекурсивно пересекайте поддеревья, которые могут содержать соответствующие записи. –
@NicoSchertler Очень хорошая точка. Вы также помогли мне увидеть недостаток в моей реализации. Если я ищу [10, 23] и 9 имеет правильный ребенок из 11, моя реализация не удастся. Благодарю. –
Итак, этот вопрос решен? –