我在C中實現了二叉搜索樹。下面的代碼正常工作,除了當我嘗試從我的樹中刪除子樹時得到SEGFAULT:嘗試從二叉搜索樹中刪除節點時得到SEGFAULT
源代碼:
#include<stdlib.h>
#include<stdio.h>
struct node {
int data;
struct node * right, * left;
};
void insert(node ** tree, int val)
{
node *temp = NULL;
if(!(*tree))
{
temp = (node *)malloc(sizeof(node));
temp->left = temp->right = NULL;
temp->data = val;
*tree = temp;
return;
}
if(val < (*tree)->data)
{
insert(&(*tree)->left, val);
}
else if(val > (*tree)->data)
{
insert(&(*tree)->right, val);
}
}
void print_preorder(node * tree)
{
if (tree)
{
printf("%d\n",tree->data);
print_preorder(tree->left);
print_preorder(tree->right);
}
}
void print_inorder(node * tree)
{
if (tree)
{
print_inorder(tree->left);
printf("%d\n",tree->data);
print_inorder(tree->right);
}
}
void print_postorder(node * tree)
{
if (tree)
{
print_postorder(tree->left);
print_postorder(tree->right);
printf("%d\n",tree->data);
}
}
void deltree(struct node* node)
{
if (node == NULL) return;
struct node *r = node->right;
deltree(node->left);
free(node);
deltree(r);
}
node* search(node ** tree, int val)
{
if(!(*tree))
return NULL;
if(val < (*tree)->data)
{
return search(&((*tree)->left), val);
}
else if(val > (*tree)->data)
{
return search(&((*tree)->right), val);
}
else if(val == (*tree)->data)
{
return *tree;
}
return NULL;
}
void _deleteTree(struct node* node)
{
if (node == NULL) return;
_deleteTree(node->left);
_deleteTree(node->right);
printf("\nDeleting node: %d", node->data);
free(node);
}
void deleteTree(struct node** node_ref)
{
_deleteTree(*node_ref);
*node_ref = NULL;
}
int main()
{
node *root;
node *tmp;
node *tmp1;
root = NULL;
insert(&root, 9);
insert(&root, 4);
insert(&root, 15);
insert(&root, 6);
insert(&root, 12);
insert(&root, 17);
insert(&root, 2);
printf("\nPrinting tree before deletion...\n");
print_postorder(root);
tmp1 = search(&root, 15);
printf("Deleting subtree...\n");
deleteTree(&tmp1);
printf("\nPrinting tree after deletion...\n");
print_postorder(root);
}
輸出:
Printing tree before deletion...
2
6
4
12
17
15
9
Deleting subtree...
Deleting node: 12
Deleting node: 17
Deleting node: 15
Printing tree after deletion...
2
6
4
Segmentation fault: 11
普萊斯e注意我想從整棵樹中刪除子樹(儘管我的代碼也適用於整棵樹)。
節點的父節點在刪除節點後引用已刪除的節點。這就是爲什麼你會遇到段錯誤,將父母設置爲空或者爲空。 – thumbmunkeys