Vymazání celý strom binárního vyhledávání najednou

hlasů
-1

Byl jsem se snaží realizovat funkci smazat BST, ale já nevím, proč to nefunguje, myslím, že je logicky správné. Může kterýkoli subjekt, prosím, řekněte mi, proč jsem dostat chybu běhu času a jak bych to měl napravit.

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

Všechny ostatní funkce pracují správně, stačí zkontrolovat delete_treefunkci, druhý kód je k dispozici pro získání představy o struktuře svého BST.

Položena 09/11/2011 v 09:22
zdroj uživatelem
V jiných jazycích...                            


7 odpovědí

hlasů
0

Ty by neměly číst od kořínků po jeho odstranění. Přesunout delete(root)řádek dolů.

Odpovězeno 09/11/2011 v 09:26
zdroj uživatelem

hlasů
3

Ve vašem 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;
    }
}

přistupujete kořenovou proměnnou poté, co jste ji smazali

Také volání

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

pre_display po odstranění stromu. delete_tree po odstranění stromu by měl také nastavit BST.head NULL

Také kritika. BST je typu stromu. Je již má hlavový člen proměnná označující kořenový uzel. Takže delete_tree / pre_display nepotřebují žádné parametry vůbec.

Odpovězeno 09/11/2011 v 09:27
zdroj uživatelem

hlasů
1

Problémem je zde:

 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;

Snažíte se přiřadit NULL člena root:

root->left=NULL;

která již byla odstraněna. Není důvod k tomu, že od té doby jste již uvolnění paměťdelete_tree(root->left);

Odpovězeno 09/11/2011 v 09:28
zdroj uživatelem

hlasů
0

Rekurzivně odstranit pomocí levé a pravé dílčí strom a váš strom bude smazána stejně jednoduché jako:

void delete(node *root){
  if(root->left==NULL && root->right==NULL)  //leaf node, delete it!!
    free(root);
  delete(root->left);
  delete(root->right);
 }
Odpovězeno 15/07/2014 v 18:12
zdroj uživatelem

hlasů
1

Můžete smazat: // Toto je funkce čištění:

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

// Toto je místo, kde můžeme volat funkci čištění:

cleantree(a);
a=NULL;

// kde „a“ je ukazatel na kořeni stromu.

Odpovězeno 24/01/2015 v 06:39
zdroj uživatelem

hlasů
0

Stručná odpověď: Vaše implementace deskriptoru uzlu chybí správný explicitní implementace destructor (výchozí generovány kompilátor bude používat volání operátoru delete: volání destruktor a uvolněním přidělený prostor na haldě) -The ten, který jasné odkazy na sourozenci

Odpovězeno 05/06/2016 v 00:39
zdroj uživatelem

hlasů
-1

Zde je můj návrh s použitím 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
}
Odpovězeno 06/02/2017 v 17:28
zdroj uživatelem

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