2014-02-07 53 views
1

我想知道是否有可能在預訂模式下釋放整個二叉搜索樹。我有這樣的功能:BST預購刪除

void preorder_del(struct s_nodo ** tree) 
{ 
    if (*tree != NULL) 
     { 
      free(*tree); 
      preorder_del(&(*tree)->left); 
      preorder_del(&(*tree)->right); 
     } 
} 

我不認爲這個工程,釋放樹的第一葉不會讓我回憶起預購的,對不對?

+0

如果你釋放節點,你如何期望'tree-> left'和'tree-> right'是任何明智的東西? – 2014-02-07 15:11:12

回答

2

您應該在本地記錄leftright以避免在free(*tree)之後訪問釋放的指針。

if (*tree != NULL) 
{ 
     struct s_nodo *l = (*tree)->left; 
     struct s_nodo *r = (*tree)->right; 
     free(*tree); 
     preorder_del(&l); 
     preorder_del(&r); 
} 
+0

它不適用於我的Mac。 「對象0x9000000000000000的malloc:***錯誤:被釋放的指針未被分配」 – SebastianC

+0

@SebastianC被編輯。我們不應該記錄'&(* tree) - > left',因爲它也被'free(* tree)'釋放。 – timrau

+0

免費(*樹)究竟是什麼?刪除所有的葉子,或只是一個指向? – SebastianC