簡體   English   中英

僅通過引用刪除二叉樹傳遞節點中的節點

[英]deletion of a node in binary tree passing node by reference only

我試圖刪除一個二叉樹,我的程序工作如下:

(1)讀取要在樹中創建的節點數。

(2)讀取所有這些節點。

(3)打印由那些節點形成的樹。

(4)在終端讀取要刪除的節點。

到這里為止一切正常,但是當我嘗試刪除所需的節點時,它會給出分段錯誤錯誤。

注意:我必須僅通過引用傳遞根(這就是為什么我在delete_tree_node(int delete_val,node ** root)中保留了兩個root指針)的原因。

我這樣做的方法是:我通過左右子遞歸地調用函數delete_tree_node()以便遍歷樹直到我得到的node值等於用戶想要刪除的節點的值。那個地方然后我free()那個節點。

我要實現此目的的代碼是:(它給出了分段問題):

delete_tree_node(int delete_val, node  **root)//two "**" because i call by reference in function call    
{
 node*temp1;
 temp1=(*root);
if(delete_val==(*root)->freq)
   {    
     free((*root));    
     temp1=temp1->left;    
     (*root)=temp1;     
   }   

if(delete_val<temp1->freq)    
   { 
     delete_tree_node(delete_val,&temp1->left);    
   }
if(delete_val>temp1->freq)    
   {
     delete_tree_node(delete_val,&temp1->right);
   }    
}

它的函數調用是:

delete_tree_node(delete_val, & head);//I give reference

有人可以幫助我了解一下嗎:

(1)為什么會產生分割錯誤。

(2)我的邏輯刪除所需的節點是否正確?,否則請您給我一段代碼作為參考?

為什么會產生細分錯誤?

因為在嘗試以temp1->left訪問相同的內存之前,您已經釋放了*root指向的內存。

讓我們仔細看一看:-

temp1 = (*root)

temp1現在與(* root)擁有相同的內存地址,即,兩者都是一些指向相同地址的數字。 為了清楚起見,我們假定該數字為“ 6”。 因此,它們兩個都指向存儲器地址“ 6”。 注意,它們不等於該地址上的值,而只是指向該地址。

現在, free((*root)); 告訴系統您正在釋放(* root)指向的內存位置,在這種情況下為6。釋放內存后,您將失去對該內存的訪問權限,並且下次請求該內存時(通過temp1->left ),則會出現細分錯誤。

我希望可以弄清楚是什么原因造成了分段錯誤。

粗略地看一眼就告訴我,您可以通過在最后釋放(* root)來解決此問題。 實際上,遞歸調用會更清晰,因為您可以通過以下偽代碼來描述它:

delete left subtree
delete right subtree
delete root

我不會深入研究邏輯的正確性,因為它似乎是一個家庭作業問題,建議您自己解決這部分問題。

您不能釋放該節點然后再訪問它。 嘗試在temp1=temp1->left之后移動自由temp1=temp1->left 另外,一旦找到正確的節點或路徑,就必須返回(或在其他情況下使用):

delete_tree_node(int delete_val, node **root)
{
  node *temp1;
  temp1 = *root;
  if(delete_val == temp1->freq)
  {    
     temp1 = temp1->left;    
     free(*root);    
     *root = temp1;     
  }   
  else if(delete_val < temp1->freq)    
  { 
     delete_tree_node(delete_val, &temp1->left);    
  }
  else if(delete_val > temp1->freq)    
  {
     delete_tree_node(delete_val, &temp1->right);
  }    
}
 temp1=(*root); // copying  the memory address of node to temp1   
 free((*root));    // your freeing the memory here of the node 
 temp1=temp1->left;    // the memory your accessing is already free'd hence segmentation fault occurs

嘗試交換兩個陳述。

temp1=temp1->left;
free((*root));

關於此處的邏輯檢查參考

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM