Я пытаюсь реализовать простое двоичное дерево в c++ с помощью указателей.
Я успешно реализовал вставку и перемещение, но у меня возникают некоторые проблемы при попытке удалить узел:
моя основная функция:
main(){
node* root=createNode(1);
root->left=createNode(2);
root->right=createNode(3);
root->left->left=createNode(4);
root->left->right=createNode(5);
root->right->left=createNode(6);
root->right->right=createNode(7);
inorder(root);
//till here it works fine
delete root->left->left; //problem starts here
cout<<"\n";
inorder(root); //exception is thrown here...
return 0;
} '
inorder функция очень базовая рекурсивная функция:
void inorder(node* root){
if(root!=NULL){
inorder(root->left);
cout<<root->data<<" ";
inorder(root->right);
}
}
Может ли кто-нибудь сказать мне, что не так с линией удаления?
После delete
попытка обращения к удаленному указателю вызовет эту проблему. Вероятно, вы хотите добавить
root->left->left = 0
после строки удаления.
Your trying to delete node which has not null nodes in both right and left side, so you to delete node like this ..
/* deletes a node from the binary search tree */
void delete ( struct btreenode **root, int num )
{
int found ;
struct btreenode *parent, *x, *xsucc ;
/* if tree is empty */
if ( *root == NULL )
{
printf ( "\nTree is empty" ) ;
return ;
}
parent = x = NULL ;
/* call to search function to find the node to be deleted */
search ( root, num, &parent, &x, &found ) ;
/* if the node to deleted is not found */
if ( found == FALSE )
{
printf ( "\nData to be deleted, not found" ) ;
return ;
}
/* if the node to be deleted has two children */
if ( x -> leftchild != NULL && x -> rightchild != NULL )
{
parent = x ;
xsucc = x -> rightchild ;
while ( xsucc -> leftchild != NULL )
{
parent = xsucc ;
xsucc = xsucc -> leftchild ;
}
x -> data = xsucc -> data ;
x = xsucc ;
}
/* if the node to be deleted has no child */
if ( x -> leftchild == NULL && x -> rightchild == NULL )
{
if ( parent -> rightchild == x )
parent -> rightchild = NULL ;
else
parent -> leftchild = NULL ;
free ( x ) ;
return ;
}
/* if the node to be deleted has only rightchild */
if ( x -> leftchild == NULL && x -> rightchild != NULL )
{
if ( parent -> leftchild == x )
parent -> leftchild = x -> rightchild ;
else
parent -> rightchild = x -> rightchild ;
free ( x ) ;
return ;
}
/* if the node to be deleted has only left child */
if ( x -> leftchild != NULL && x -> rightchild == NULL )
{
if ( parent -> leftchild == x )
parent -> leftchild = x -> leftchild ;
else
parent -> rightchild = x -> leftchild ;
free ( x ) ;
return ;
}
}
Вам нужно будет установить root->left->left
на NULL
то есть указать на ничего
В вашем коде
main()
{
node* root=createNode(1);
root->left=createNode(2);
root->right=createNode(3);
root->left->left=createNode(4);
root->left->right=createNode(5);
root->right->left=createNode(6);
root->right->right=createNode(7);
inorder(root);
//Now, Complete program will work
delete root->left->left = 0; //problem solved
cout<<"\n";
inorder(root); // Do you still face any problem ?
return 0;
}
После удаления узла вам нужно сбросить родительский левый указатель до нуля. Это не может привести к непредсказуемым результатам, в зависимости от того, как реализовано управление памятью. Некоторые системы исключают ссылки на освобожденную память
createNode
лиcreateNode
left
иright
указатели вnull
?