Модифицированное 2-3-4 дерево - алгоритмы
У меня есть 2-3-4 дерева, но оно изменено так, что только листья имеют значения. Я не уверен, если листья точные слова. Листья (в моем описании) - это узлы в нижней части дерева с максимальной глубиной (это узлы в конце дерева). Каждый отпуск имеет одно значение. Другие узлы (не листья) имеют "значение" наименьшего значения его дочерних узлов. Так что это правильное дерево:
2
/ \
3 2
/ | \ / | \
8 3 4 7 2 5
Мне нужно написать несколько псевдокодов, которые имеют максимальную сложность O (log n). Мне нужно написать минимум (возвращает минимум из дерева), вставить (k) (вставить новый отпуск со значением k), уменьшить ключ (x,k) (изменить ключ в списке x на k), удалить (x) удалить отпуск из дерева и извлечь мин (удалить отпуск с минимальным значением).
Я пытался написать что-то сам, но я не уверен, правильно ли я это делаю и удовлетворяю ли я условию сложности.
class Node234 {
int value;
int count;
Node234 []childrens;
Node234 parent;
}
Node234 minimum()
{
minimum(root);
}
Node234 minimum(Node234 node)
{
if(node.count == 0)
{
return node;
}
for(i = 0; i < node.count; i++)
{
if(node.value == node.childrens[i].value)
return minimum(node.childrens[i]);
}
}
insert(int newValue)
{
insert(newValue, root);
}
insert(int newValue, Node234 node)
{
if(node.count == 0)
{
Node234 newNode = new Node234(newValue);
insert(newNode, newValue, node);
}
else
{
insert(newValue, node.childrens[node.count-1]);
}
}
insert(Node234 newNode, int newValue, Node234 node)
{
if(node.parent == null)
{
Node234 newNodeParent = new Node234(newValue);
newNodeParent.childrens[0] = node;
node.parent = newNodeParent;
newNodeParent.childrens[1] = newNode;
newNode.parent = newNodeParent;
if(node.value < newNode.value)
newNodeParent.value = node.value;
}
else
{
if(node.parent.count == 4)
{
Node234 newNodeParent = new Node234(newValue);
node.parent.count--;
if(node.parent.value == node.value)
{
setMinForNode(node.parent);
}
newNodeParent.childrens[0] = node;
node.parent = newNodeParent;
newNodeParent.childrens[1] = newNode;
newNode.parent = newNodeParent;
if(node.value < newValue)
newNodeParent.value = node.value;
insert(newNodeParent, newNode.value, node.parent);
}
else
{
node.parent.childrens[node.parent.count] = newNode;
node.parent.count++;
if(newNode.value < node.parent.value)
{
changeAllParentKeys(newNode, newNode.value);
}
}
}
}
changeAllParentKeys(Node234 node, int newValue)
{
if(node.parent != null && node.parent.value > newValue)
{
node.parent.value = newValue;
changeAllParentKeys(node.parent, newValue);
}
}
setMinForNode(Node234 parent)
{
parent.value = parent.childrens[0].value;
for(i = 1; i < parent.count; i++)
{
if(parent.value > parent.childrens[i].value)
parent.value = parent.childrens[i].value;
}
}
Я надеюсь, что минимальная функция в порядке, но это функция вставки в порядке? Не слишком ли сложно? Не могли бы вы помочь мне удовлетворить условие сложности? Можете ли вы помочь мне с другими функциями (алгоритм на словах будет достаточно:)).