adding cs235
This commit is contained in:
@@ -0,0 +1,169 @@
|
||||
#include "bst.h"
|
||||
|
||||
bst::bst(): root(NULL){}
|
||||
|
||||
bst::~bst() {
|
||||
while(root) {
|
||||
remove(root->data);
|
||||
}
|
||||
}
|
||||
|
||||
NodeInterface* bst::getRootNode() {
|
||||
return root;
|
||||
}
|
||||
|
||||
bool bst::add(int data) {
|
||||
if(root == NULL) {
|
||||
root = new node(data);
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
node* current;
|
||||
node* parent;
|
||||
current = root;
|
||||
while(current) {
|
||||
parent = current;
|
||||
if(data == current->data) {
|
||||
return false;
|
||||
}
|
||||
if(data > current->data) {
|
||||
current = current->right;
|
||||
}
|
||||
else {
|
||||
current = current->left;
|
||||
}
|
||||
}
|
||||
if(data < parent->data) {
|
||||
parent->left = new node(data);
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
parent->right = new node(data);
|
||||
return true;;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool bst::remove(int data) {
|
||||
bool found = false;
|
||||
if(root == NULL) {
|
||||
return false;
|
||||
}
|
||||
node* current;
|
||||
node* parent;
|
||||
current = root;
|
||||
while(current) {
|
||||
if(current->data == data) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
else {
|
||||
parent = current;
|
||||
if(data > current->data) {
|
||||
current = current->right;
|
||||
}
|
||||
else if(data < current->data) {
|
||||
current = current->left;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!found) {
|
||||
return false;
|
||||
}
|
||||
if(root->data == data) {
|
||||
if(root->right != NULL && root->left == NULL) {
|
||||
node* temp;
|
||||
temp = root;
|
||||
root = root->right;
|
||||
delete temp;
|
||||
return true;
|
||||
}
|
||||
if(root->right == NULL && root->left != NULL) {
|
||||
node* temp;
|
||||
temp = root;
|
||||
root = root->left;
|
||||
delete temp;
|
||||
return true;
|
||||
}
|
||||
if(root->right != NULL && root->left != NULL) {
|
||||
node* temp;
|
||||
temp = root;
|
||||
root = root->left;
|
||||
root->right = temp->right;
|
||||
delete temp;
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
delete root;
|
||||
root = NULL;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if((current->left == NULL) && (current->right == NULL)) {
|
||||
if(parent->left == current) {
|
||||
parent->left = NULL;
|
||||
}
|
||||
else {
|
||||
parent->right = NULL;
|
||||
}
|
||||
delete current;
|
||||
return true;
|
||||
}
|
||||
if((current->left == NULL && current->right != NULL) || (current->left != NULL && current->right == NULL)) {
|
||||
if(current->left == NULL && current->right != NULL) {
|
||||
if(parent->left == current) {
|
||||
parent->left = current->right;
|
||||
delete current;
|
||||
}
|
||||
else {
|
||||
parent->right = current->right;
|
||||
delete current;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if(parent->left == current) {
|
||||
parent->left = current->left;
|
||||
delete current;
|
||||
}
|
||||
else {
|
||||
parent->right = current->left;
|
||||
delete current;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if(current->left != NULL && current->right != NULL) {
|
||||
node* greatest_right;
|
||||
greatest_right = current->right;
|
||||
if((greatest_right->left == NULL) && (greatest_right->right == NULL)) {
|
||||
current = greatest_right;
|
||||
delete greatest_right;
|
||||
current->right = NULL;
|
||||
}
|
||||
else {
|
||||
if(current->right->left != NULL) {
|
||||
node* left;
|
||||
node* temp_left;
|
||||
temp_left = current->right;
|
||||
left = current->right->left;
|
||||
while(left->left != NULL) {
|
||||
temp_left = left;
|
||||
left = left->left;
|
||||
}
|
||||
current->data = left->data;
|
||||
delete left;
|
||||
temp_left->left = NULL;
|
||||
}
|
||||
else {
|
||||
node* temp;
|
||||
temp = current->right;
|
||||
current->data = temp->data;
|
||||
current->right = temp->right;
|
||||
delete temp;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
Reference in New Issue
Block a user