Usuwanie węzły BST za pomocą wolnego (n)

głosy
0

Mam kodowanie przeszukiwanie binarne drzewo i mam mały problem ze znalezieniem sposobu na skuteczne usunięcie węzła.

Mam ten kod:

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;
}

I N jest budowa węzła, który posiada 5 pól: Wartość, lChild, rChild, wielkość, wysokość. W rzeczywistości to, co robię tutaj jest, aby drzewo nie wskazują kierunku węzła, który chcę usunąć ale gdy próbuję umieścić coś takiego:

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

Lub każdy podobny kod szuka, to nie działa. Czy ktoś może wskazać mi w dobrym kierunku, proszę? Dziękuję Ci.

Utwórz 30/03/2011 o 17:20
źródło użytkownik
W innych językach...                            


1 odpowiedzi

głosy
0

Przede wszystkim mówisz N = NULL, a następnie wywołanie N-> lchild N jest nieważna i wskazując na nic tak jak można oczekiwać, aby uzyskać wartość lchild?

Ponieważ jest to praca domowa nie dam bezpośredniej odpowiedzi, ale podpowiedzi.

Aby usunąć węzeł, należy sprawdzić, czy ma dzieci, jeśli nie robi go uwolnić i usunąć odwołania do niego takie jak ptr rodzice dziecka. Jeśli ma 1 dziecko zamienić ptr, który wskazuje na węzeł, który chcesz usunąć z dzieckiem i uwolnić węzeł. To samo dotyczy sytuacji, gdy masz również 2 dzieci.

Odpowiedział 30/03/2011 o 17:24
źródło użytkownik

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