修改2-3-4树 - 算法

时间:2014-03-17 10:35:18

标签: algorithm tree 2-3-4-tree

我没有2-3-4树,但它已被修改,只有叶子有值。我不确定叶子是否是确切的词。叶子(在我的描述中)是树底部的节点,具有最大深度(这些是树末端的节点)。每个假期都有一个值。其他节点(不是叶子)具有"值"他孩子节点的最小值。所以这是有效的树:

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

我需要编写一些具有最大复杂度O(log n)的伪代码。我必须写最小值(从树返回最小值),插入(k)(插入带k值的新假),减少键(x,k)(将列表x中的键更改为k),删除(x)从树中删除离开并提取min(删除最小值的假)。

我试图自己写一些东西,但我不确定我是否正确这样做,如果我满足复杂条件。

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 个答案:

没有答案