Что не так с моей реализацией BST?

У меня есть домашнее задание из школы, и я должен внедрить BST для решения двух проблем.
поэтому я начал, и мне нужно только функции стирания, вставки и поиска.
но каждый раз, когда я запускаю свой код, я получаю ошибку сегментации. Может кто-нибудь мне помочь??
это мой код:

#include <iostream>
#include <stack>
#include <vector>
#include <algorithm>
#include <set>
#include <cstdio>
#define MP make_pair
#define pb push_back
#define X first
#define Y second

using namespace std;

typedef unsigned long long int ulli;ulli n;using namespace std;

struct BST{ // Binary Search Tree
struct node{ // Node
node *left; // Left Child
node *par; // Parent node
node *right; // Right child
int val; // the value

node(){
left = par = right = NULL;
val = 0;
}

};
node *root; // Root of the tree

BST(){
root = NULL;
}
bool insert( int value ){
node *tmp = new node;

tmp->val = value;

if ( root == NULL ){
root = tmp;
return 0;
}

node *cur = root;
while ( tmp->par != cur ){
if ( tmp->val < cur->val ){
if ( cur->left == NULL ){
tmp->par = cur;
cur->left = tmp;
break;
}
cur = cur->left;
}else{
if ( cur->right == NULL ){
tmp->par = cur;
cur->right = tmp;
break;
}
cur = cur->right;
}
}
return 0;
}

node *search( int val ){
node *tmp = root;
while( tmp->val != val ){
if ( val < tmp->val )
tmp = tmp->left;
else
tmp = tmp->right;
if ( tmp == NULL ){
return NULL;
}
}
return tmp;
}

bool erase( int val ){
node *tmp = search( val ), *k;
k = tmp;
if ( tmp == root ){
if ( tmp->left == NULL && tmp->right == NULL ){
root = NULL;
delete tmp;
}
if ( tmp->left != NULL && tmp->right == NULL ){
root = root->left;
delete tmp;
return 0;
}
if ( tmp->left == NULL && tmp->right != NULL ){
root = root->right;
delete tmp;
return 0;
}
tmp = tmp->right;
while( tmp->left != NULL )
tmp = tmp->left;
if ( tmp->right != NULL )
tmp->par->left = tmp->right;
else
tmp->par->left = NULL;
tmp->par = NULL;
tmp->right = k->right;
tmp->left = k->left;
root = tmp;
return 0;
}
if ( tmp->left == NULL && tmp->right == NULL ){
if ( tmp->par->left == tmp )
tmp->par->left = NULL;
else
tmp->par->right = NULL;
delete tmp;
}
if ( tmp->left != NULL && tmp->right == NULL ){
tmp->left->par = tmp->par;
if ( tmp->par->left == tmp )
tmp->par->left = tmp->left;
else
tmp->par->right = tmp->left;
delete tmp;
return 0;
}
if ( tmp->left == NULL && tmp->right != NULL ){
tmp->right->par = tmp->par;
if ( tmp->par->left == tmp )
tmp->par->left = tmp->right;
else
tmp->par->right = tmp->right;
delete tmp;
return 0;
}
tmp = tmp->right;
while( tmp->left != NULL )
tmp = tmp->left;
if ( tmp->right != NULL )
tmp->par->left = tmp->right;
else
tmp->par->left = NULL;
tmp->par = k->par;
if ( k->par->right == k )
k->par->right = tmp;
else
k->par->left = tmp;
tmp->right = k->right;
tmp->left = k->left;
}};

BST b;

vector<int> v;

int main () {
cin >> n;
int k;
for ( int i = 0; i < n; i++ ){
cin >> k;
v.pb( k );
b.insert( k );
}
for ( int i = 0; i < n; i++ )
b.erase( v[i] );return 0;
}

-4

Решение

Вы разыменовываете свисающий указатель, я полагаю, потому что вам не хватает return 0; заявление

   bool erase( int val ){
node *tmp = search( val ), *k;
k = tmp;
if ( tmp == root ){
if ( tmp->left == NULL && tmp->right == NULL ){
root = NULL;
delete tmp; // tmp is deleted, should no longer be used afterwards
// return 0; // Missing return 0
}
if ( tmp->left != NULL && tmp->right == NULL ){
...
}
if ( tmp->left == NULL && tmp->right != NULL ){
...
}
tmp = tmp->right; // tmp is dereferenced
while( tmp->left != NULL )
tmp = tmp->left;

Также: у вас нет проверки ошибок в случае search(val) возвращается NULL хотя это возможно

node *search( int val ){
node *tmp = root;
while( tmp->val != val ){
if ( val < tmp->val )
tmp = tmp->left;
else
tmp = tmp->right;
if ( tmp == NULL ){
return NULL; <---
}
}
return tmp;
}
2

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector