Mazání uzly v BST pomocí volného (n)

hlasů
0

Jsem kódování binární vyhledávací strom, a mám trochu problém najít způsob, jak účinně odstranit uzel.

Mám tento kód:

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

A N je struktura uzel, který má 5 pole: hodnota, lChild, rChild, velikost, výška. Ve skutečnosti to, co tady dělám, je, aby se strom nesmí směřovat k uzlu, který chci vymazat, ale když jsem se snaží dát něco jako:

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

Nebo každý podobný hledá kód, to nefunguje. Může mi někdo místo v správným směrem, prosím? Děkuji.

Položena 30/03/2011 v 17:20
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
0

Za prvé říkáš N = NULL a potom voláním r-> lchild N je null a ukázal na nic tak, jak očekáváte získat hodnotu lchild?

Protože se jedná o domácí nedám přímou odpověď, ale narážky.

Chcete-li odstranit uzel, zkontrolujte, zda má děti, je-li to doesnt uvolnit a odstranit odkazy na něj, jako jsou rodiče dítěte PTR. Pokud má 1 dítě swapu PTR, který odkazuje na uzel, který chcete vymazat s dítětem a uvolnit uzel. Totéž platí, pokud máte také 2 děti.

Odpovězeno 30/03/2011 v 17:24
zdroj uživatelem

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