B-дерево: удалить неконечный узел?
Я изучаю дерево B и в книге они сказали, что:
Если ключ k находится в узле x и x является листом, удалите ключ k из x.
Если ключ k находится в узле x, а x является внутренним узлом, выполните следующие действия.
а. Если дочерний элемент y, который предшествует k в узле x, имеет по крайней мере t ключей, то найдите предшественника k 'of k в поддереве с корнем в y. Рекурсивно удалите k 'и замените k на k' в x. (Нахождение k 'и удаление его может быть выполнено за один проход вниз.)
б. Симметрично, если дочерний элемент z, следующий за k в узле x, имеет не менее t ключей, то найдите преемника k 'в k в поддереве с корнем в z. Рекурсивно удалите k 'и замените k на k' в x. (Нахождение k 'и удаление его может быть выполнено за один проход вниз.)
с. В противном случае, если у y и z есть только ключи t- 1, объедините k и все z в y, чтобы x потерял и k, и указатель на z, а y теперь содержит 2t - 1 ключей. Затем освободите z и рекурсивно удалите k из y.
Мой вопрос таков: в случае 2.a. Может ли кто-нибудь объяснить мне пример: рекурсивно удалить k 'и заменить k на k' в x.
С уважением.
1 ответ
Предположим, у вас есть дерево b со степенью t = 4:
26, 49, 60
27,31,34,36 51,55,56,58
предполагать y = [27,31,34,36]
, x = [51,55,56,58]
не являются конечными узлами, и вы хотите удалить ключ k = 51
, Позволять K = 49
быть ключом в родительском узле, который разделяется x
а также y
,
Найти предшественника k
который является самым правым ключом k'
в поддереве y
(который может содержать целые числа от 37 до 48 в этом примере, скажем, k' = 40
). Задавать k = K = 49
а также K = k' = 40
и удалить k'
рекурсивно (что на самом деле является первым случаем процедуры удаления, когда узел является листовым). Результирующее дерево b выглядит как
26, 40, 60
27,31,34,36 49,55,56,58