Δυαδική Αναζήτηση Tree - Διαγραφή

ψήφοι
1

Προσπαθώ να γράψω ένα πρόγραμμα που παίρνει σε χορδές και τα τοποθετεί σε ένα δυαδικό δέντρο αναζήτησης κατά αλφαβητική σειρά φορά αυτά εισάγονται στο δέντρο, ένας χρήστης ζητά μια λέξη που θέλετε να διαγράψετε, διαγράφοντας έτσι ότι κόμβο από το δέντρο, και στη συνέχεια, εξόδου το δέντρο χωρίς αυτόν τον κόμβο πίσω στην τάξη.

Όλα λειτουργούν γι 'αυτό μέχρι την λειτουργία διαγραφής, η λειτουργία διαγραφής κάνει δουλειά, αλλά πολύ παράξενο του πώς διαγράφει. Νομίζω ότι σήμερα διαγράφει μια πλήρη πλευρά του δέντρου, γιατί όταν μπορώ να διαγράψω την τελευταία λέξη, συνήθως λειτουργεί. Θα ανεβάσετε λειτουργία διαγραφής μου και αν χρειάζεται να γίνουν περισσότερα μπορώ να φορτώσετε το υπόλοιπο του κωδικού μου.

Ευχαριστώ!

template<typename T> void Delete(TreeNode<T>*& root, const T& data)
{
    if (root == NULL)
        return;
        if(data < root->Value)
            return Delete(root->Left, data);
        else if (root->Value > data)
            return Delete(root->Right, data);
        else
        {
            TreeNode<T>* old_root = root;
            if (root->Left == NULL)
            {
                root = root->Right;
            }
            else if (root->Right == NULL)
            {
                root = root->Left;
            }
            else
            {
                replace_parent(old_root, old_root->Left);
            }
            delete old_root;



    }

};

template<typename T> void replace_parent(TreeNode<T>*& old_root, TreeNode<T>*& root)
{
    if (root->Right != NULL)
    {
        replace_parent(old_root, root->Right);
    }
    else
    {
        old_root->Value = root->Value;
        old_root = root;
        root = root->Left;
    }
};
Δημοσιεύθηκε 31/03/2011 στις 03:24
πηγή χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
1

Περιπτώσεις για δεξιά ή αριστερά ον NULLείναι καλό. Ωστόσο, η λογική σας για κανένα από αυτά να NULLείναι, δυστυχώς, παραλείποντας.

Αν Διαβάζω τον κωδικό σας (και την κατανόηση της λειτουργίας replace_parent()σωστά, στη συνέχεια, αν δεν το δέντρο είναι άδειο θέλετε να αντικαταστήσετε την τρέχουσα ρίζα με Left.

Ρωτήστε τον εαυτό σας - τι συμβαίνει με τις αξίες που βρίσκονται στο Rightυποδέντρο;

Τι πρέπει να κάνετε για να διαγράψετε ένα κόμβο έχει ως εξής:

  1. Εισάγετε ένα από τα υποδένδρων. Φαίνεται ότι έχετε επιλέξει το Leftδευτερεύον δέντρο, έτσι θα πάμε από εκεί.
  2. Ακολουθήστε την αντίθετη γραμμή των καταστημάτων. Σε αυτό το παράδειγμα, συνεχίστε τις Rightυποδένδρων από το αρχικό σας Left. Συνεχίστε μέχρι να βρείτε έναν κόμβο δεξί φύλλο (δεν Rightυποδένδρων? LeftΕίναι ΟΚ)
  3. Θυμηθείτε την αξία του δικαιώματος φύλλα σας σε μια tmpμεταβλητή.
  4. Μεταφέρετε το δικαίωμα φύλλα του Left(εάν NULLή όχι) στη θέση του δεξιού φύλλου του.
  5. Πάρτε την tmpαξία και το βάζουμε στο πρωτότυπο «στη διαγραφή» του κόμβου σας.
Απαντήθηκε 31/03/2011 στις 03:38
πηγή χρήστη

ψήφοι
2

Lacqui είναι σωστό στα σημεία του.

επιτρέψτε μου να σας πω ότι κατά τη διαγραφή ενός κόμβου θα πρέπει να το αντικαταστήσετε είτε με τη μέγιστη κόμβου στο αριστερό υπο δέντρο ή το ελάχιστο κόμβο προς τη σωστή υπο δέντρο. Για παράδειγμα: αν δείτε την παρακάτω εικόνα: εισάγετε περιγραφή της εικόνας εδώ

αν θέλετε να διαγράψετε τον κόμβο 90, θα πρέπει να ασχοληθούν με το οποίο μπορείτε να το αντικαταστήσετε είτε με 80 το οποίο είναι το μέγιστο κόμβο της στο αριστερό υποδένδρο ή το 92 οποία η ελάχιστη κόμβο προς τη σωστή υπο δέντρο. μπορείτε να κρατήσετε οποιοδήποτε από προσέγγισης.

έτσι ώστε η algo θα είναι: λαμβάνοντας υπόψη το αριστερό υπο δέντρο:

-> αν βρείτε τον κόμβο για να διαγράψετε, μεταβείτε στην μέγιστη τιμή στο αριστερό υπο δέντρο της.

-> ορίσετε το αριστερό του κόμβου 50 και το δικαίωμα κόμβο να είναι 150

-> κάνουν 75-> επόμενο ως άκυρη και διαγραφή 90

Απαντήθηκε 18/04/2011 στις 11:22
πηγή χρήστη

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