[英]Delete a leaf node in binary tree
我正在嘗試從二進制搜索樹中刪除leaf node
,但它對我不起作用,我調試了代碼,但是我找不到問題。 我可以看到流向正確,調用到達leaf node
地址,然后調用free
。 但是在那之后,當我執行pre-order
遍歷時,我看到值仍然存在。
我創建的二叉樹(它是一個簡單的樹)-:
10
/ \
6 14
要刪除的Leaf Node
值= 14
;
刪除之前Pre - order
遍遍結果= 10->6->14
。 這被打印在我的控制台上。
刪除leaf node
代碼-:
// Delete a leaf node
void deleteNode(struct Nodes * root,int value){
// Check if root is null
if (root == NULL) {
return;
}
// If no left and right node present, it's a leaf node. Perform delete.
while (root->left == NULL && root->right == NULL) {
// Check if value at leaf node is same as value to be deleted. If yes, go inside (if).
if (root->info == value) {
printf("Delete the leaf node \n");
printf("delete node address is \n %p",root);
// free the root (which is currently a leaf node)
free(root);
return;
}
}
// keep checking if value to be deleted is on right or left, till a value is found.
if (root->info < value) {
// Ccheck on right
deleteNode(root->right,value);
}else{
// check on left
deleteNode(root->left,value);
}
}
我沒有任何errors
,所以我無法猜測根本原因 。
刪除后, Pre - order
遍歷結果= 10->6->14
。 誰能幫我嗎? 我知道我犯了一個非常愚蠢的錯誤,或者我的概念仍然不清楚。
如果需要其他任何信息,請告訴我。
輸出圖像-:您可以看到我的值正確,並且地址相同。
free
”幾乎意味着“我發誓不再使用內存,它可能會被釋放或任意重新分配”。
你違反了那個諾言。 釋放內存后,您還必須忘記該地址上的所有引用。 父節點仍會記住該節點以前所在的地址,並且偶然地該內存尚未被回收。
您有一個典型的“免費使用后使用”錯誤。 如果您在兩者之間分配了另一個節點,則在再次遍歷之前,您會注意到內存損壞。
您可以在函數中添加另一個參數,該參數指向父對象中的指針。 這樣,您可以修改父級。
或將引用存儲回該節點中的父級。
無論哪種。
一種方法是在遞歸調用中將指針傳遞給父對象。 像這樣:
void deleteNode(struct Nodes *root, struct Nodes *parent, int value){
// Check if root is null
if (root == NULL) {
return;
}
if ((root->info == value) && (root->left == NULL) && (root->right == NULL)) {
if (parent->left->info == value) {free(parent->left); parent->left = NULL;}
else {free(parent->right); parent->right = NULL;}
}
else if (root->info < value) {
// check on right
deleteNode(root->right,root, value);
}else{
// check on left
deleteNode(root->left,root, value);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.