2016-04-20 1 views
0

У меня есть следующий дерево двоичного поиска (в C++), и у меня есть вопрос к конкретной строке кода:Binary Tree «поведение»

delete k; 

Мой код работает, если я удалить эту строку, и я не понимаю почему. По моему мнению: данные из k вставляются в дерево, а затем, после этого, переменная k удаляется. Почему данные также удаляются из дерева?

вот мой код:

#include <iostream> 
using namespace std; 
struct nod 
{ 
nod *st=NULL; 
int info; 
nod *dr=NULL; 
int h; 
nod *par=NULL;  // par = "father" 
}; 
struct avl  
{ 
nod *rad=NULL;     //rad = root; 
void insert(nod *z)    //INSERT 
{ 
    nod *y = NULL; 
    nod *x = rad; 
    while (x != NULL) 
    { 
     y = x; 
     if (z->info < x->info) 
     { 
      x = x->st;   // st = left 
     } 
     else 
     { 
      x = x->dr;  //dr = right 
     } 
    } 
    if (y == NULL) 
    { 
     rad = z; 
    } 
    else 
    { 
     if (z->info < y->info) 
     { 
      y->st = z; 
     } 
     else 
     { 
      y->dr = z; 
     } 
    } 
    z->par = y; 
} 
void inordine(nod *k) 
{ 
    if (k) 
    { 
     inordine(k->st); 
     cout << k->info<<"\t"; 
     inordine(k->dr); 
    } 
} 
}; 
int main(void) 
{ 
avl *arbore = new avl; 
int el = 5; 
arbore->rad=NULL; 
while (el >= 0) 
{ 
    cout << "element\n"; 
    cin >> el; 
     nod *k = new nod; 
     k->dr = NULL; 
     k->st = NULL; 
     k->par = NULL; 
     k->info = el; 
     arbore->insert(k); 
     delete k; 
} 
cout << "print inordine\n"; 
arbore->inordine(arbore->rad); 


} 

ответ

1

данные из к вставляется в дерево и ТОГДА то переменная к удаляется

Нет, к это просто указатель. Он указывает на кивок (e). Вы вставляете этот узел в свое дерево (передавая его как указатель). Это не копия, это тот же узел. delete не удаляет переменную, она удаляет узел, поэтому вы также удаляете его из дерева.

Большой аргумент против сырых указателей, как вы используете, заключается в том, что трудно выразить, кто является владельцем объекта. Это доказательство, подтверждающее этот аргумент. Вы ожидали, что дерево принадлежит своим узлам, ваша программа показывает противоположное поведение.

Для правильного удаления узлов вам потребуется деструктор, который пересекает дерево и удаляет каждый узел при уничтожении дерева. Вам также необходимо будет скрыть фактические узлы от ваших пользователей деревьев с помощью вставок, таких как avl::insert(int info, int h);