我没有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;
}
}
我希望最小功能没问题,但插入功能好吗?不是太复杂了吗?你能帮助我满足复杂性条件吗?你能帮我解决其他功能(单词算法就足够了:))。