Я читаю команды из текстового файла. Пример ввода:
Create Key 2
Create Key 1
Create Key 3
Update Key 1
Delete Key 2
Я хочу сократить количество операций, выполняемых моей программой. Например, создавать Key2 бесполезно, только удалять его после.
Чтобы минимизировать количество операций, я решил сохранить их в бинарном дереве поиска. В книге Кормена, Лизерсона, Ривеста и Стейна «Введение в алгоритмы», третье издание, двоичное дерево поиска (BST) явно определено как разрешающее дубликаты. Буква после ключа обозначает «Создать», «Обновить» или «Удалить». Простой пример будет следующим:
K2(C)
/ \
/ \
K1(C) K3(C) <-- The deepest Key3 appears here.
\ /
K1(U) K2(D) <-- The deepest Key1 and Key2 appear here.
Как уже отмечалось, я хотел бы иметь возможность извлекать все уникальные ключи в их самой глубокой позиции, чтобы минимизировать количество операций. Я не мог найти ссылку на это в CLRS, возможно, я искал не ту вещь ...
Простого поиска, который возвращает ключ, недостаточно, поскольку он возвращает первый найденный узел, поэтому поиск по ширине или по глубине не будет работать.
struct node* search(struct node* root, int key)
{
// Base Cases: root is null or key is present at root
if (root == NULL || root->key == key)
return root;
// Key is greater than root's key
if (root->key < key)
return search(root->right, key);
// Key is smaller than root's key
return search(root->left, key);
Как обрабатывать дубликаты в бинарном дереве поиска? описывает, как обрабатывать вставку дубликатов, а не как извлекать дубликаты, которые появляются последними.
Другая идея заключается в том, чтобы вернуть правильный самый уникальный ключ следующим образом:
struct node * maxValueNode(struct node* node)
{
struct node* current = node;
/* loop down to find the rightmost leaf */
while (current->right != NULL)
current = current->right;
return current;
}
Я что-то здесь упускаю? Как я могу найти самый глубокий УНИКАЛЬНЫЙ узел двоичного дерева?