Удаление узлов в BST, используя свободный (N)

голоса
0

Я кодирование бинарного дерева поиска и у меня немного трудно найти способ эффективного удаления узла.

У меня этот код:

struct node* deleteNode(int i, struct node *N)

{
    if (N==NULL)
    {
        return NULL;
    }
    else if (i<N->value)
    {
        N->size--;
        N->lChild=deleteNode(i,N->lChild);
    }
    else if (i>N->value)
    {
        N->size--;
        N->rChild=deleteNode(i,N->rChild);
    }
    else if (N->lChild==NULL)
    {
        return N->rChild;
    }
    else if (N->rChild==NULL)
    {
        return N->lChild;
    }
    else
    {
        N->size--;
        N->value=findMin(N->rChild);
        N->rChild=deleteNode(N->value,N->rChild);
    }
    return N;
}

И Н представляет собой структуру, узел, который имеет 5 полей: значение, lChild, rChild, размер, высота. На самом деле то, что я делаю здесь, чтобы дерево не указывают на узел, который я хочу, чтобы удалить, но когда я пытаюсь поставить что-то вроде:

    else if (N->rChild==NULL)
    {
        free(N);
        N=NULL;
        return N->lChild;
    }

Или каждый подобный взгляд код, он не работает. Может кто-то мне точку в правильном направлении, пожалуйста? Спасибо.

Задан 30/03/2011 в 17:20
источник пользователем
На других языках...                            


1 ответов

голоса
0

Прежде всего, вы хотите сказать, что N = NULL, а затем вызвать N-> N lchild равно нулю, указывая на нет, так как вы ожидаете получить значение lchild?

Поскольку это домашнее задание, я не буду давать прямой ответ, но намеки.

Чтобы удалить узел, проверьте, если у него есть дети, если оно не освобождает его и удалить ссылки на него, такие как родители ребенка PTR. Если у него есть 1 ребенок своп ВТР, что указывает на узел, который вы хотите удалить с ребенком и освободить узел. То же самое относится, если у вас также есть 2 детей.

Ответил 30/03/2011 в 17:24
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more