Διαγραφή κόμβους σε BST χρησιμοποιώντας ελεύθερο (Ν)

ψήφοι
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;
}

Και N είναι μια δομή κόμβων που έχουν 5 πεδία: αξία, lChild, rChild, το μέγεθος, το ύψος. Στην πραγματικότητα αυτό που κάνω εδώ είναι να κάνει το δέντρο να μην δείχνουν προς τον κόμβο που θέλετε να διαγράψετε, αλλά όταν προσπαθώ να βάλει κάτι σαν:

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

Ή κάθε παρόμοια κωδικό αναζητούν, δεν λειτουργεί. Μπορεί κάποιος να μου το σημείο προς τη σωστή κατεύθυνση παρακαλώ; Ευχαριστώ.

Δημοσιεύθηκε 30/03/2011 στις 17:20
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
0

Πρώτα απ 'όλα που λέτε Ν = NULL και, στη συνέχεια, καλώντας Ν> lchild Ν είναι άκυρη και δείχνει σε τίποτα, έτσι πώς περιμένετε να πάρετε την τιμή lchild;

Δεδομένου ότι αυτό είναι το σπίτι μου δεν θα δώσει μια άμεση απάντηση, αλλά υπαινιγμούς.

Για να διαγράψετε τον κόμβο, ελέγξτε αν έχει παιδιά, αν αυτό doesnt να απελευθερώσει και να αφαιρεθούν οι αναφορές σε αυτό, όπως η ptr τους γονείς του παιδιού. Αν έχει 1 παιδί ανταλλαγής η ptr που οδηγεί στον κόμβο που θέλετε να διαγράψετε με το παιδί και να ελευθερώσει τον κόμβο. Το ίδιο ισχύει αν έχετε επίσης 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