Διαγραφή ολόκληρο το δυαδικό δένδρο αναζήτησης ταυτόχρονα

ψήφοι
-1

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

  #include <iostream>
  using namespace std;

class node{
public:
int data;
node *right;
node *left;
node(){
    data=0;
    right=NULL;
    left=NULL;
      }
};

class tree{
node *head;
int maxheight;
     public:
tree(){head=0;maxheight=-1;}
bool deletenode(int key,node* root);
int get_height(){return maxheight;}
void insert(int key);
void pre_display(node* root);
     void delete_tree(node *root);
     node* get_head(){return head;}
         };

void tree::insert(int key){
     node *current=head;
    node *newnode=new node;

    if(newnode==NULL)
    throw(key);

    newnode->data=key;
    int height=0;

if(head==0){
head=newnode;
     }
else
{
    while(1){
    if(current->right==NULL && current->data < newnode->data)
    {
        current->right=newnode;
        height++;
        break;
    }
    else if(current->left==NULL && current->data > newnode->data)
    {
        current->left=newnode;
        height++;
        break;
    }
    else if(current->right!=NULL && current->data < newnode->data)
    {
         current=current->right;
         height++;
   }
    else if(current->left!=NULL && current->data > newnode->data)
    {
               current=current->left;
          height++;
    }
         }
 }
 if(height>maxheight)
 maxheight=height;
 }

 void tree::pre_display(node *root){
 if(root!=NULL)
 {
 cout<<root->data<< ;
 pre_display(root->left);
 pre_display(root->right);
 }
 }

 void tree::delete_tree(node *root){
  if(root!=NULL)
 {
 delete_tree(root->left);
 delete_tree(root->right);
 delete(root);
 if(root->left!=NULL)
 root->left=NULL;
 if(root->right!=NULL)
 root->right=NULL;
 root=NULL;
 }
 }

int main(){
tree BST;
int arr[9]={17,9,23,5,11,21,27,20,22},i=0;

for(i=0;i<9;i++)
BST.insert(arr[i]);

BST.pre_display(BST.get_head());
cout<<endl;
BST.delete_tree(BST.get_head());
BST.pre_display(BST.get_head());
cout<<endl;

system(pause);
return 0;
}

Όλες οι άλλες λειτουργίες λειτουργούν σωστά, το μόνο που χρειάζεται για να ελέγξετε τη delete_treeλειτουργία, ο άλλος κωδικός παρέχεται για να δώσει την ιδέα της κατασκευής της BST μου.

Δημοσιεύθηκε 09/11/2011 στις 09:22
πηγή χρήστη
Σε άλλες γλώσσες...                            


7 απαντήσεις

ψήφοι
0

Δεν πρέπει να διαβάσετε από τη ρίζα μετά τη διαγραφή της. Μετακινήστε το delete(root)γραμμή προς τα κάτω.

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

ψήφοι
3

Σε delete_tree σας

void tree::delete_tree(node *root){
    if(root!=NULL)
    {
        delete_tree(root->left);
        delete_tree(root->right);
        delete(root);
        if(root->left!=NULL)
            root->left=NULL;
        if(root->right!=NULL)
            root->right=NULL;
        root=NULL;
    }
}

έχετε πρόσβαση root μεταβλητή, αφού έχουν διαγραφεί

Επίσης μπορείτε να καλέσετε

    BST.delete_tree(BST.get_head());
BST.pre_display(BST.get_head());

pre_display μετά τη διαγραφή δέντρο. delete_tree μετά τη διαγραφή του δέντρου πρέπει επίσης να ρυθμίσετε το BST.head σε NULL

Επίσης μια κριτική. BST είναι δέντρο τύπου. Έχει ήδη μια μεταβλητή μέλος κεφαλής που δείχνει τον κόμβο ρίζας. Έτσι delete_tree / pre_display δεν χρειάζεται οποιεσδήποτε παραμέτρους σε όλα.

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

ψήφοι
1

Το πρόβλημα είναι εδώ:

 delete_tree(root->left);
 delete_tree(root->right);
 delete(root);
 if(root->left!=NULL)
 root->left=NULL;
 if(root->right!=NULL)
 root->right=NULL;
 root=NULL;

Προσπαθείς να εκχωρήσετε NULL σε ένα μέλος της ρίζας:

root->left=NULL;

η οποία είχε ήδη διαγραφεί. Δεν υπάρχει καμία ανάγκη να το κάνουμε αυτό από τη στιγμή που ήδη απελευθερώνοντας τη μνήμηdelete_tree(root->left);

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

ψήφοι
0

Αναδρομικά διαγράψετε το αριστερό και το δεξί υπο δέντρο και το δέντρο σας θα διαγραφεί τόσο απλό:

void delete(node *root){
  if(root->left==NULL && root->right==NULL)  //leaf node, delete it!!
    free(root);
  delete(root->left);
  delete(root->right);
 }
Απαντήθηκε 15/07/2014 στις 18:12
πηγή χρήστη

ψήφοι
1

Μπορείτε να διαγράψετε από: // Αυτή είναι η λειτουργία του καθαρισμού:

void cleantree(tree *root){
 if(root->left!=NULL)cleantree(root->left);
 if(root->right!=NULL)cleantree(root->right);
 delete root;}

// Αυτό είναι που καλούμε τη συνάρτηση καθαρισμού:

cleantree(a);
a=NULL;

// Σε περίπτωση «α» είναι δείκτης στη ρίζα του δέντρου.

Απαντήθηκε 24/01/2015 στις 06:39
πηγή χρήστη

ψήφοι
0

Σύντομη απάντηση: την εφαρμογή σας για το Περιγραφέας κόμβου λείπει το σωστό ρητή εφαρμογή καταστροφέα (η προεπιλογή που παράγεται από το μεταγλωττιστή θα χρησιμοποιηθούν από την κλήση του τελεστή delete: καλώντας καταστροφέα και την αποδέσμευση του διατεθεί χώρος στο σωρό) -το ένα που σαφείς αναφορές για το αδέλφια

Απαντήθηκε 05/06/2016 στις 00:39
πηγή χρήστη

ψήφοι
-1

εδώ είναι η πρότασή μου, χρησιμοποιώντας recursivity ..

 template <class T> void Tree<T>::destroy(Noeud<T> ** r){

            if(*r){
                if(!(*r)->left && !(*r)->right){  //a node having no child
                  delete *r; *r=NULL;
                }else if((*r)->left && (*r)->right){ //a node having two childs
                    destroy(&(*r)->left); //destroy the left tree
                    destroy(&(*r)->right); //destroy the right tree
                    destroy(r); //destroy the node
                }else if((*r)->left){ //a node has only left child
                    destroy(&(*r)->left); //destroy the left tree
                    destroy(r); //destroy the node
                }else if((*r)->right){ //a node has only right child
                    destroy(&(*r)->right); //destroy the right tree
                    destroy(r); //destroy the node
                }
            }
}

//in function main()
int main(){
Tree<int> a(5); // 'a' is a tree of int type with a root value equal 5
a.add(2);a.add(7);a.add(6);a.add(-1);a.add(10); // insert values into the tree 
a.destroy(&a.root);  //destroy the tree
}
Απαντήθηκε 06/02/2017 στις 17:28
πηγή χρήστη

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