0

私は2-3-4ツリーを持っていますが、葉だけが値を持つように変更されています。葉が正確な言葉かどうかはわかりません。葉 (私の説明では) は、ツリーの下部にある最大の深さのノードです (これらはツリーの最後にあるノードです)。各休暇には 1 つの値があります。他のノード (リーフではない) には、子ノードの最小値の「値」があります。したがって、これは有効なツリーです:

      2
    /   \
  3      2
/ | \  / | \
8 3 4  7 2  5

最大の複雑さ O(log n) を持つ疑似コードをいくつか書く必要があります。最小値 (ツリーから最小値を返す)、insert(k) (k 値で新しい休暇を挿入)、キー (x,k) の減少 (リスト x のキーを k に変更)、削除 (x) ツリーから休暇を削除する必要があります。 min を抽出します (最小値の leave を削除します)。

私は自分で何かを書こうとしましたが、これが正しいかどうか、複雑な条件を満たしているかどうかはわかりません。

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;
  }
}

最低限の機能は大丈夫だといいのですが、挿入機能は大丈夫ですか?複雑すぎませんか?複雑な条件を満たすのを手伝ってくれませんか?他の機能で私を助けてくれませんか(言葉のアルゴリズムで十分です:))。

4

0 に答える 0