[英]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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.