Удаление узла в бинарном дереве поиска. 2 конкретный c Строки в узле должны соответствовать 2 аргументам, переданным через метод удаления - PullRequest
1 голос
/ 27 апреля 2020

Я пишу программу, которая может манипулировать бинарным деревом поиска. Одним из необходимых методов является метод remove (). Я передаю 2 строковых аргумента в метод, и узел должен удалить, если 2 строковые переменные в узле (имя, фамилия) соответствуют соответствующим строковым аргументам.

Основной метод

    Tree directory = new Tree();
    InputData newPerson1 = new InputData("luca", "galati", "asdasda", "sadfasdf");
    directory.insert(newPerson1);
    InputData newPerson2 = new InputData("sdfasf", "blackman", "asdasda", "sadfasdf");
    directory.insert(newPerson2);
    InputData newPerson3 = new InputData("fsdgdfg", "kramer", "asdasda", "sadfasdf");
    directory.insert(newPerson3);
    InputData newPerson4 = new InputData("dsafgas", "wallace", "asdasda", "sadfasdf");
    directory.insert(newPerson4);
    InputData newPerson5 = new InputData("asdfasdfasdf", "dangelo", "asdasda", "sadfasdf");
    directory.insert(newPerson5);
    InputData newPerson6 = new InputData("sfasdasfas", "alla", "asdasda", "sadfasdf");
    directory.insert(newPerson6);
    InputData newPerson7 = new InputData("hfdhsds", "eeves", "asdasda", "sadfasdf");
    directory.insert(newPerson7);

    directory.remove("kodfjgasdfg", "blackman");

    File output = new File ("output.txt");
    output.delete();
    directory.print();

метод remove ()

boolean remove (String firstName, String lastName)
{
    Node focusNode = root;
    Node parent = root;

    boolean isItALeftChild = true;

    while (!lastName.equals(focusNode.inputData.lastName) && !focusNode.inputData.firstName.equals(firstName))
    {
        parent = focusNode;

        if (lastName.compareTo(focusNode.inputData.lastName) < 0)
        {
            isItALeftChild = true;
            focusNode = focusNode.leftChild;
        }
        else if (lastName.compareTo(focusNode.inputData.lastName) > 0)
        {
            isItALeftChild = false;
            focusNode = focusNode.rightChild;
        }
        else
        {
            if (firstName.compareTo(focusNode.inputData.firstName) < 0)
            {
                isItALeftChild = true;
                focusNode = focusNode.leftChild;
            }
            else if (firstName.compareTo(focusNode.inputData.firstName) > 0)
            {
                isItALeftChild = false;
                focusNode = focusNode.rightChild;
            }
        }
        if (focusNode == null)
        {
            return false;
        }
    }
    if (focusNode.leftChild == null && focusNode.rightChild == null)
    {
        if (focusNode == root)
        {
            root = null;
        }
        else if (isItALeftChild)
        {
            parent.leftChild = null;
        }
        else
        {
            parent.rightChild = null;
        }
    }
    else if (focusNode.rightChild == null)
    {
        if (focusNode == root)
        {
            root = focusNode.leftChild;
        }
        else if (isItALeftChild)
        {
            parent.leftChild = focusNode.leftChild;
        }
        else
        {
            parent.rightChild = focusNode.leftChild;
        }
    }
    else if (focusNode.leftChild == null)
    {
        if (focusNode == root)
        {
            root = focusNode.rightChild;
        }
        else if (isItALeftChild)
        {
            parent.leftChild = focusNode.rightChild;
        }
        else
        {
            parent.rightChild = focusNode.rightChild;
        }
    }
    else if (focusNode.leftChild != null && focusNode.rightChild != null)
    {
        Node replacement = getReplacementNode(focusNode);

        if (focusNode == root)
        {
            root = replacement;
        }
        else if (isItALeftChild)
        {
            parent.leftChild = replacement;
        }
        else
        {
            parent.rightChild = replacement;
        }
        replacement.leftChild = focusNode.leftChild;
    }
    return true;
}

getReplacementNode () метод

Node getReplacementNode(Node replacedNode)
{
    Node replacementParent = null;
    Node replacement = null;

    Node focusNode = replacedNode.rightChild;

    while (focusNode != null)
    {
        replacementParent = replacement;
        replacement = focusNode;
        focusNode = focusNode.leftChild;
    }
    if (replacement != replacedNode.rightChild)
    {
        replacementParent.leftChild = replacement.rightChild;
        replacement.rightChild = replacedNode.rightChild;
    }
    return replacement;
}
...