2016-04-20 61 views
0

我有以下二叉搜索樹(在C++),我有特定的代碼行一個問題:二叉樹的「行爲」

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

從k的數據被插入到樹,然後再變量k被刪除

號,k是隻是一個指針。它指向點頭(e)。您將此節點插入到您的樹中(通過將其作爲指針傳遞)。它不是副本,它是同一個節點。刪除不會刪除變量,它會刪除節點,因此您也將其從樹中刪除。

對於像你正在使用的原始指針的一個大論據是,很難表示誰是對象的所有者。這是支持這一論點的證據。你期待樹擁有它的節點,你的程序顯示出相反的行爲。

要正確處理節點,您需要一個遍歷樹的析構函數,並在銷燬樹時刪除每個節點。您還需要使用像avl::insert(int info, int h);

這樣的插入來隱藏樹用戶的實際節點