एक ही बार में पूरे द्विआधारी खोज वृक्ष हटाया जा रहा है

वोट
-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;
    }
}

आप तक पहुँच रहे हैं जड़ चर के बाद आप इसे नष्ट कर दिया है

इसके अलावा, आप फोन

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

पेड़ को हटाने के बाद pre_display। delete_tree पेड़ को हटाने के बाद भी शून्य करने के लिए BST.head स्थापित करना चाहिए

इसके अलावा एक आलोचना। 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;

आप रूट के एक सदस्य को शून्य आवंटित करने के लिए कोशिश कर रहे हैं:

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

संक्षिप्त उत्तर: नोड वर्णनकर्ता सही स्पष्ट नाशक कार्यान्वयन लापता के अपने कार्यान्वयन (डिफ़ॉल्ट संकलक द्वारा उत्पन्न हटाने ऑपरेटर को फोन करके उपयोग किया जाएगा: नाशक बुला और ढेर पर आबंटित स्थान रिहा) -इस एक है कि करने के लिए स्पष्ट संदर्भ एक माँ की संताने

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