Троичные деревья поиска VS Бинарные деревья поиска
Троичные деревья поиска очень распространены в области редактирования текста. Их можно использовать для реализации функции "Автозаполнение", проверки орфографии, поиска совпадений по частям, поиска по соседству и многих других опций.
Причиной их известности является их космическая эффективность по сравнению с попытками (хотя попытки выполняются быстрее) и их гибкость (по сравнению с Hashtables).
Тернарные деревья поиска имеют три указателя в узле данных: lokid
левый ребенок, hikid
правильный ребенок и midkid
средний ребенок.
Я скучаю по тому, зачем нам средний ребенок? В чем особенность этого указателя? В каких вещах было бы лучше иметь этот указатель, чем вообще не иметь его?
Я рисовал несколько деревьев, и я думаю, что мы можем реализовать то же самое, используя только 2 указателя (двоичное дерево поиска) со вставками, идущими к левому ребенку, если текущий символ в строке для вставки равен или меньше символа на текущем узле и вставки, идущие вправо, наоборот.
На следующем рисунке показано двоичное дерево, сгенерированное из вставленных слов: KARIM, KARAS, SARAS.
Алгоритм вставки приведенного выше дерева может быть похож на следующий псевдокод:
insert(root, word){
if(!root) {
root = new node()
root->char = *(word++)
}
if(*word > root->char)
insert(root->right, word)
else {
if(*word == root->char)
insert(root->left, word++)
else
insert(root->left, word)
}
}
Что может быть не так с вышеуказанной концепцией? Я что-то упускаю из троичных деревьев, что делает их превосходящими двоичные деревья?