adding cs235
This commit is contained in:
@@ -0,0 +1,383 @@
|
||||
#include "avl.h"
|
||||
|
||||
avl::avl(): root(NULL) {}
|
||||
|
||||
avl::~avl() {
|
||||
deltree(root);
|
||||
}
|
||||
|
||||
void avl::deltree (node* root) {
|
||||
// if(root != NULL) {
|
||||
// deltree(root->left);
|
||||
// deltree(root->right);
|
||||
// }
|
||||
// delete root;
|
||||
}
|
||||
|
||||
NodeInterface* avl::getRootNode() {
|
||||
return root;
|
||||
}
|
||||
|
||||
bool avl::add(int data) {
|
||||
bool found = 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;
|
||||
}
|
||||
root = build(root, data);
|
||||
return true;
|
||||
}
|
||||
|
||||
node* avl::build(node* root, int data) {
|
||||
node* temp1 = NULL;
|
||||
node* temp2 = NULL;
|
||||
if(root == NULL) {
|
||||
root = new node(data);
|
||||
h = true;
|
||||
return root;
|
||||
}
|
||||
if(data < root->data) {
|
||||
root->left = build(root->left, data);
|
||||
if(h) {
|
||||
switch(root->height) {
|
||||
case 1:
|
||||
temp1 = root->left;
|
||||
if(temp1->height == 1) {
|
||||
root->left = temp1->right;
|
||||
temp1->right = root;
|
||||
root->height = 0;
|
||||
root = temp1;
|
||||
}
|
||||
else {
|
||||
temp2 = temp1->right;
|
||||
temp1->right = temp2->left;
|
||||
temp2->left = temp1;
|
||||
root->left = temp2->right;
|
||||
temp2->right = root;
|
||||
if(temp2->height == 1) {
|
||||
root->height = -1;
|
||||
}
|
||||
else {
|
||||
root->height = 0;
|
||||
}
|
||||
if(temp2->height == -1) {
|
||||
temp1->height = 1;
|
||||
}
|
||||
else {
|
||||
temp1->height = 0;
|
||||
}
|
||||
root = temp2;
|
||||
}
|
||||
root->height = 0;
|
||||
h = false;
|
||||
break;
|
||||
case 0:
|
||||
root->height = 1;
|
||||
break;
|
||||
case -1:
|
||||
root->height = 0;
|
||||
h = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(data > root->data) {
|
||||
root->right = build(root->right, data);
|
||||
if(h) {
|
||||
switch(root->height) {
|
||||
case 1:
|
||||
root->height = 0;
|
||||
h = false;
|
||||
break;
|
||||
case 0:
|
||||
root->height = -1;
|
||||
break;
|
||||
case -1:
|
||||
temp1 = root->right;
|
||||
if(temp1->height == -1) {
|
||||
root->right = temp1->left;
|
||||
temp1->left = root;
|
||||
root->height = 0;
|
||||
root = temp1;
|
||||
}
|
||||
else {
|
||||
temp2 = temp1->left;
|
||||
temp1->left = temp2->right;
|
||||
temp2->right = temp1;
|
||||
root->right = temp2->left;
|
||||
temp2->left = root;
|
||||
if(temp2->height == -1) {
|
||||
root->height = 1;
|
||||
}
|
||||
else {
|
||||
root->height = 0;
|
||||
}
|
||||
if(temp2->height == 1) {
|
||||
temp1->height = -1;
|
||||
}
|
||||
else {
|
||||
temp1->height = 0;
|
||||
}
|
||||
root = temp2;
|
||||
}
|
||||
root->height = 0;
|
||||
h = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return root;
|
||||
}
|
||||
|
||||
bool avl::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;
|
||||
}
|
||||
root = del_leaf(root, data);
|
||||
return true;
|
||||
}
|
||||
|
||||
node* avl::del_leaf(node* root, int data) {
|
||||
node* temp;
|
||||
if(root == NULL) {
|
||||
return root;
|
||||
}
|
||||
else {
|
||||
if(data < root->data) {
|
||||
root->left = del_leaf(root->left, data);
|
||||
if(h) {
|
||||
root = bal_right(root);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if(data > root->data) {
|
||||
root->right = del_leaf(root->right, data);
|
||||
if(h) {
|
||||
root = bal_left(root);
|
||||
}
|
||||
}
|
||||
else {
|
||||
temp = root;
|
||||
if(temp->right == NULL) {
|
||||
root = temp->left;
|
||||
h = true;
|
||||
delete temp;
|
||||
}
|
||||
else {
|
||||
if(temp->left == NULL) {
|
||||
root = temp->right;
|
||||
h = true;
|
||||
delete temp;
|
||||
}
|
||||
else {
|
||||
temp->left = del(temp->left, temp);
|
||||
if(h) {
|
||||
root = bal_right(root);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return root;
|
||||
}
|
||||
|
||||
node* avl::del(node* succ, node* n) {
|
||||
node* temp = succ;
|
||||
if(succ->right != NULL) {
|
||||
succ->right = del(succ->right, n);
|
||||
if(h) {
|
||||
succ = bal_left(succ);
|
||||
}
|
||||
}
|
||||
else {
|
||||
node* current;
|
||||
node* parent;
|
||||
current = root;
|
||||
while(current) {
|
||||
if(current->data == succ->data) {
|
||||
break;
|
||||
}
|
||||
else {
|
||||
parent = current;
|
||||
if(succ->data > current->data) {
|
||||
current = current->right;
|
||||
}
|
||||
else if(succ->data < current->data) {
|
||||
current = current->left;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(root->left->data == succ->data) {
|
||||
root->data = succ->data;
|
||||
n->right = root->right;
|
||||
succ = succ->left;
|
||||
delete temp;
|
||||
h = true;
|
||||
return succ;
|
||||
}
|
||||
else if(root->right->data == succ->data) {
|
||||
root->data = succ->data;
|
||||
n->right = root->right;
|
||||
succ = succ->right;
|
||||
delete temp;
|
||||
h = false;
|
||||
return succ;
|
||||
}
|
||||
temp = succ;
|
||||
n->data = succ->data;
|
||||
succ = succ->left;
|
||||
delete temp;
|
||||
h = true;
|
||||
}
|
||||
return succ;
|
||||
}
|
||||
|
||||
node* avl::bal_right(node* root) {
|
||||
node* temp1 = NULL;
|
||||
node* temp2 = NULL;
|
||||
switch(root->height) {
|
||||
case 1:
|
||||
root->height = 0;
|
||||
break;
|
||||
case 0:
|
||||
root->height = -1;
|
||||
h = false;
|
||||
break;
|
||||
case -1:
|
||||
temp1 = root->right;
|
||||
if(temp1->height <= 0) {
|
||||
root->right = temp1->left;
|
||||
temp1->left = root;
|
||||
if(temp1->height == 0) {
|
||||
root->height = -1;
|
||||
temp1->height = 1;
|
||||
h = false;
|
||||
}
|
||||
else {
|
||||
root->height = 0;
|
||||
temp1->height = 0;
|
||||
}
|
||||
root = temp1;
|
||||
}
|
||||
else {
|
||||
temp2 = temp1->left;
|
||||
temp1->left = temp2->right;
|
||||
temp2->right = temp1;
|
||||
root->right = temp2->left;
|
||||
temp2->left = root;
|
||||
if(temp2->height == -1) {
|
||||
root->height = 1;
|
||||
}
|
||||
else {
|
||||
root->height = 0;
|
||||
}
|
||||
if(temp2->height == 1) {
|
||||
temp1->height = -1;
|
||||
}
|
||||
else {
|
||||
temp1->height = 0;
|
||||
}
|
||||
root = temp2;
|
||||
temp2->height = 0;
|
||||
}
|
||||
}
|
||||
return root;
|
||||
}
|
||||
|
||||
node* avl::bal_left(node* root) {
|
||||
node* temp1 = NULL;
|
||||
node* temp2 = NULL;
|
||||
switch(root->height) {
|
||||
case -1:
|
||||
root->height = 0;
|
||||
break;
|
||||
case 0:
|
||||
root->height = 1;
|
||||
h = false;
|
||||
break;
|
||||
case 1:
|
||||
temp1 = root->left;
|
||||
if(temp1->height >= 0) {
|
||||
root->left = temp1->right;
|
||||
temp1->right = root;
|
||||
if(temp1->height == 0) {
|
||||
root->height = 1;
|
||||
temp1->height = -1;
|
||||
h = false;
|
||||
}
|
||||
else {
|
||||
root->height = 0;
|
||||
temp1->height = 0;
|
||||
}
|
||||
root = temp1;
|
||||
}
|
||||
else {
|
||||
temp2 = temp1->right;
|
||||
temp1->right = temp2->left;
|
||||
temp2->left = temp1;
|
||||
root->left = temp2->right;
|
||||
temp2->right = root;
|
||||
if(temp2->height == 1) {
|
||||
root->height = -1;
|
||||
}
|
||||
else {
|
||||
root->height = 0;
|
||||
}
|
||||
if(temp2->height == -1) {
|
||||
temp1->height = 1;
|
||||
}
|
||||
else {
|
||||
temp1->height = 0;
|
||||
}
|
||||
root = temp2;
|
||||
temp2->height = 0;
|
||||
}
|
||||
}
|
||||
return root;
|
||||
}
|
||||
|
||||
void avl::display(node* root) {
|
||||
if(root != NULL) {
|
||||
display(root->left);
|
||||
cout << root->data << "\t";
|
||||
display(root->right);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user