I'm trying to implement a tree from an hpp file and I seem to be running into issues with the delete functionality. The logic I am following makes sense, however I cannot seem to figure out why it crashes when I print something out after removing an object.
Tree::Tree() {
root=NULL;
}
void Tree::print() const {
printinOrder(root);
}
void Tree::printinOrder(Tree::Node* root) const {
if (root == NULL) return;
printinOrder(root->left);
cout<<root->val<<",";
printinOrder(root->right);
}
Tree::Node::Node(DataType value) {
left = NULL;
right = NULL;
val = value;
}
bool Tree::tree_ins(Tree::Node* node, Tree::Node* insert_node) {
if (node-> val == insert_node->val) return false;
if (insert_node->val > node->val && node-> right == NULL) {
node->right = insert_node;
return true;
}
if (insert_node->val < node->val && node-> left == NULL) {
node->left = insert_node;
return true;
}
if (insert_node->val > node->val) return tree_ins(node->right, insert_node);
if (insert_node->val < node->val) return tree_ins(node->left, insert_node);
}
bool Tree::insert(int val) {
if (root == NULL) {
root = new Node(val);
return true;
}
Node* insert_node = new Node(val);
return tree_ins (root, insert_node);
}
Tree::Node* Tree::getMinValue(Tree::Node* node) {
if (node->left == NULL) {
return node;
}
return getMinValue(node->left);
}
bool Tree::tree_rem(Tree::Node* test_node, int value) {
if (test_node == NULL) return false;
else if (value < test_node-> val) tree_rem (test_node-> left, value);
else if (value > test_node-> val) tree_rem (test_node-> right, value);
else {
if (test_node-> left==NULL && test_node->right == NULL) {
delete (test_node);
return true;
}
else if (test_node-> left==NULL) {
test_node->val = (test_node->right)->val;
test_node = test_node ->right;
test_node=NULL;
return true;
}
else if (test_node-> right==NULL) {
test_node->val = (test_node->left)->val;
test_node = test_node ->left;
test_node=NULL;
return true;
} else {
Node* minNode = getMinValue(test_node->right);
test_node->val = minNode->val;
tree_rem(test_node->right, minNode->val);
return true;
}
}
}
bool Tree::remove(int val) {
if (root == NULL) {
return false;
}
Node* temp = root;
return tree_rem (temp, val);
}
Insertion works, printing the tree works. I noticed that after removing an object printing the tree crashes the program, however if I insert something right after removing an object, and then print the tree, it does not crash (but inserts it into the wrong location)
If I run it in this sequence, it crashes:
bst->insert(5);
bst->insert(3);
bst->insert(7);
bst->remove(7);
bst->print();