2-3 (два-три) метода вставки дерева C#

У меня проблема с реализацией метода вставки 2-3 деревьев в C#. У меня есть простая реализация B-дерева, и на этой основе мне нужно создать метод вставки для 2-3-дерева. Я смотрел видео, как работают 2-3 дерева, но не знаю, как это реализовать в коде.

Может ли кто-нибудь помочь мне отредактировать этот код и сделать его для 2-3 деревьев.

Вот код для B-дерева, который у меня есть:

void Main()
{
BTree bTree = new BTree(4);

foreach (int key in new[] { 4, 6, 8, 3, 9, 1, 11, 12, 14, 17, 5, 20, 25})
{
    bTree.Insert(key);
}
}

public class BTree
{
private Node root;

private int minDegree;

private class Node
{
    int minDegree;

    public Node[] Children { get; set; }

    public int[] Keys { get; set; }

    public bool IsLeaf { get; set; }

    public int Size { get; set; }

    public Node(int degree)
    {
        minDegree = degree;
        Keys = new int[(2 * degree) - 1];
        Children = new Node[2 * degree];
    }
}

  public BTree(int minDegree)
{
    if (minDegree < 2)
    {
        throw new Exception("B tree degree must be at least 2");
    }

    this.minDegree = minDegree;
    root = new Node(minDegree);
    root.IsLeaf = true;
}

public void Insert(int value)
{
    InsertNode(root, value);
}

private void InsertNode(Node current, int value)
{
    Node temp = root;

    if (current.Size == (2 * minDegree) - 1)
    {
        Node newRoot = new Node(minDegree);
        root = newRoot;
        newRoot.IsLeaf = false;
        newRoot.Size = 0;
        newRoot.Children[0] = temp;
        SplitChild(newRoot, 0);
        InsertNonFull(newRoot, value);
    }
    else
    {
        InsertNonFull(current, value);
    }
}

private void InsertNonFull(Node current, int value)
{
    int i = current.Size - 1;

    if (current.IsLeaf)
    {
        while (i >= 0 && value < current.Keys[i])
        {
            current.Keys[i + 1] = current.Keys[i];
            i -= 1;
        }
        current.Keys[i + 1] = value;
        current.Size += 1;
    }
    else
    {
        while (i >= 0 && value < current.Keys[i])
        {
            i -= 1;
        }
        i += 1;

        if (current.Children[i].Size == (2 * minDegree) - 1)
        {
            SplitChild(current, i);
            if (value > current.Keys[i])
            {
                i += 1;
            }
        }
        InsertNonFull(current.Children[i], value);
    }
}

private void SplitChild(Node nonFullParent, int indexOfFullChild)
{
    Node newNode = new Node(minDegree);
    Node fullChild = nonFullParent.Children[indexOfFullChild];

    newNode.IsLeaf = fullChild.IsLeaf;
    newNode.Size = minDegree - 1;

    for (int i = 0; i < minDegree - 1; i++)
    {
        newNode.Keys[i] = fullChild.Keys[i + minDegree];
    }

    if (!fullChild.IsLeaf)
    {
        for (int i = 0; i < minDegree; i++)
        {
            newNode.Children[i] = fullChild.Children[i + minDegree];
        }
    }

    fullChild.Size = minDegree - 1;

    for (int i = nonFullParent.Size; i == indexOfFullChild + 1; i--)
    {
        nonFullParent.Children[i + 1] = nonFullParent.Children[i];
    }
    nonFullParent.Children[indexOfFullChild + 1] = newNode;

    for (int i = nonFullParent.Size; i == indexOfFullChild; i--)
    {
        nonFullParent.Keys[i + 1] = nonFullParent.Keys[i];
    }
    nonFullParent.Keys[indexOfFullChild] = fullChild.Keys[minDegree - 1];
    nonFullParent.Size = nonFullParent.Size + 1;
}

public bool Find(int value)
{
    Node result = FindNode(root, value);
    if (result != null)
    {
        return true;
    }
    return false;
}

private Node FindNode(Node current, int value)
{
    Node temp = current;

    int i = 0;

    while (i <= current.Size - 1 && value > current.Keys[i])
    {
        i++;
    }

    if (i <= current.Size - 1 && value == current.Keys[i])
    {
        return current;
    }
    else if (current.IsLeaf)
    {
        return null;
    }
    else
    {
        return FindNode(current.Children[i], value);
    }
}
}

0 ответов

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