Модифицированное 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;
  }
}

Я надеюсь, что минимальная функция в порядке, но это функция вставки в порядке? Не слишком ли сложно? Не могли бы вы помочь мне удовлетворить условие сложности? Можете ли вы помочь мне с другими функциями (алгоритм на словах будет достаточно:)).

0 ответов

Другие вопросы по тегам