Если вы внимательно прочитаете статью в вики, вы увидите, что есть два основных варианта B-деревьев (исключая структурные варианты, такие как B * и B +), один с ключами t
-> 2t
, и один с t
-> 2t+1
клавишами.
Переводя эти варианты в #children, у нас есть один с t+1
-> 2t+1
children и один с t+1
-> 2t+2
children.
Таким образом, по существу, чтобы ответить на ваш вопрос, 2-3 дерева и 2-3-4 дерева являются допустимыми деревьями, каждое в соответствии со своим вариантом / определением:
2-3 относится к первому виду (t+1
-> 2t+1
детей, где t = 1)
2-3-4 относится ко второму виду (t+1
-> 2t+2
детей, где t = 1)
Действительность обоих вариантов проистекает из того факта, что допустимы как разбиения, так и слияния (действия, выполняемые при удалении и вставке из / в ADT):
t
-> 2t
:
Split.
Происходит, когда мы добавляем новый элемент, а у узла больше максимального количества ключей 2t
Таким образом, у нас есть ключи 2t+1
, мы разделяем узел на два узла и помещаем один элемент в родительский элемент, оставляя ключи 2t
в двух дочерних элементах и ключи t
в каждом дочернем элементе. Это приемлемо, потому что минимальное количество ключей в узле действительно t
.
Объединить.
Происходит, когда мы удаляем ключ, а узел содержит меньше минимального числа, t
, и его родной брат тоже минимален. Таким образом, у нас есть t-1 + t
ключи в нашем новом объединенном узле, результирующий узел должен быть действительным: t-1 + t = 2t-1 <= 2t
. Отлично.
То же самое с t
-> 2t+1
:
Split.
2t+2
становится t
и t+1
, что в порядке.
Объединить.
t-1 + t = 2t-1 <= 2t+1
Конечно, нет разницы во времени выполнения, это просто небольшое различие в реализации, имеющее небольшую теоретическую важность (вы можете немного оптимизировать некоторые алгоритмы с помощью первого варианта, но не настолько, чтобы это изменило сложности во время выполнения).