-
-
Save harish-r/097688ac7f48bcbadfa5 to your computer and use it in GitHub Desktop.
/* AVL Tree Implementation in C++ */ | |
/* Harish R */ | |
#include<iostream> | |
using namespace std; | |
class BST | |
{ | |
struct node | |
{ | |
int data; | |
node* left; | |
node* right; | |
int height; | |
}; | |
node* root; | |
void makeEmpty(node* t) | |
{ | |
if(t == NULL) | |
return; | |
makeEmpty(t->left); | |
makeEmpty(t->right); | |
delete t; | |
} | |
node* insert(int x, node* t) | |
{ | |
if(t == NULL) | |
{ | |
t = new node; | |
t->data = x; | |
t->height = 0; | |
t->left = t->right = NULL; | |
} | |
else if(x < t->data) | |
{ | |
t->left = insert(x, t->left); | |
if(height(t->left) - height(t->right) == 2) | |
{ | |
if(x < t->left->data) | |
t = singleRightRotate(t); | |
else | |
t = doubleRightRotate(t); | |
} | |
} | |
else if(x > t->data) | |
{ | |
t->right = insert(x, t->right); | |
if(height(t->right) - height(t->left) == 2) | |
{ | |
if(x > t->right->data) | |
t = singleLeftRotate(t); | |
else | |
t = doubleLeftRotate(t); | |
} | |
} | |
t->height = max(height(t->left), height(t->right))+1; | |
return t; | |
} | |
node* singleRightRotate(node* &t) | |
{ | |
node* u = t->left; | |
t->left = u->right; | |
u->right = t; | |
t->height = max(height(t->left), height(t->right))+1; | |
u->height = max(height(u->left), t->height)+1; | |
return u; | |
} | |
node* singleLeftRotate(node* &t) | |
{ | |
node* u = t->right; | |
t->right = u->left; | |
u->left = t; | |
t->height = max(height(t->left), height(t->right))+1; | |
u->height = max(height(t->right), t->height)+1 ; | |
return u; | |
} | |
node* doubleLeftRotate(node* &t) | |
{ | |
t->right = singleRightRotate(t->right); | |
return singleLeftRotate(t); | |
} | |
node* doubleRightRotate(node* &t) | |
{ | |
t->left = singleLeftRotate(t->left); | |
return singleRightRotate(t); | |
} | |
node* findMin(node* t) | |
{ | |
if(t == NULL) | |
return NULL; | |
else if(t->left == NULL) | |
return t; | |
else | |
return findMin(t->left); | |
} | |
node* findMax(node* t) | |
{ | |
if(t == NULL) | |
return NULL; | |
else if(t->right == NULL) | |
return t; | |
else | |
return findMax(t->right); | |
} | |
node* remove(int x, node* t) | |
{ | |
node* temp; | |
// Element not found | |
if(t == NULL) | |
return NULL; | |
// Searching for element | |
else if(x < t->data) | |
t->left = remove(x, t->left); | |
else if(x > t->data) | |
t->right = remove(x, t->right); | |
// Element found | |
// With 2 children | |
else if(t->left && t->right) | |
{ | |
temp = findMin(t->right); | |
t->data = temp->data; | |
t->right = remove(t->data, t->right); | |
} | |
// With one or zero child | |
else | |
{ | |
temp = t; | |
if(t->left == NULL) | |
t = t->right; | |
else if(t->right == NULL) | |
t = t->left; | |
delete temp; | |
} | |
if(t == NULL) | |
return t; | |
t->height = max(height(t->left), height(t->right))+1; | |
// If node is unbalanced | |
// If left node is deleted, right case | |
if(height(t->left) - height(t->right) == 2) | |
{ | |
// right right case | |
if(height(t->left->left) - height(t->left->right) == 1) | |
return singleLeftRotate(t); | |
// right left case | |
else | |
return doubleLeftRotate(t); | |
} | |
// If right node is deleted, left case | |
else if(height(t->right) - height(t->left) == 2) | |
{ | |
// left left case | |
if(height(t->right->right) - height(t->right->left) == 1) | |
return singleRightRotate(t); | |
// left right case | |
else | |
return doubleRightRotate(t); | |
} | |
return t; | |
} | |
int height(node* t) | |
{ | |
return (t == NULL ? -1 : t->height); | |
} | |
int getBalance(node* t) | |
{ | |
if(t == NULL) | |
return 0; | |
else | |
return height(t->left) - height(t->right); | |
} | |
void inorder(node* t) | |
{ | |
if(t == NULL) | |
return; | |
inorder(t->left); | |
cout << t->data << " "; | |
inorder(t->right); | |
} | |
public: | |
BST() | |
{ | |
root = NULL; | |
} | |
void insert(int x) | |
{ | |
root = insert(x, root); | |
} | |
void remove(int x) | |
{ | |
root = remove(x, root); | |
} | |
void display() | |
{ | |
inorder(root); | |
cout << endl; | |
} | |
}; | |
int main() | |
{ | |
BST t; | |
t.insert(20); | |
t.insert(25); | |
t.insert(15); | |
t.insert(10); | |
t.insert(30); | |
t.insert(5); | |
t.insert(35); | |
t.insert(67); | |
t.insert(43); | |
t.insert(21); | |
t.insert(10); | |
t.insert(89); | |
t.insert(38); | |
t.insert(69); | |
t.display(); | |
t.remove(5); | |
t.remove(35); | |
t.remove(65); | |
t.remove(89); | |
t.remove(43); | |
t.remove(88); | |
t.remove(20); | |
t.remove(38); | |
t.display(); | |
} |
add the criterion for that.
...
else if( x == t->data) return t;
...
I referred to this project and re-implemented AVLTree. Thanks @harish-r!
AVLTree-CPP
Inorder display isn't working, we can print each node by storing it, why is that?
something like this is missing , is it ?
1.) Add
int max(int left,int right)
{
return (left >= right) ? left : right;
}
and :
2.) change
class BST
{
public:
and : cout << t->data << " ";
inorder(t->right);
}
- change
//public:
BST()
{
root = NULL;
}
Does anyone knows how to update the AVL tree using Linked List?
AVL Tree Implementation in C++ from : https://atechdaily.com/posts/AVL-Tree-Implementation-in-Cplusplus
man this doesnt work i get SIGSEG when trying this:
BST t;
t.insert(5);
t.insert(3);
t.insert(7);
t.insert(10);
t.insert(12);
t.remove(3);
t.insert(11);
t.insert(13);
t.display();
rotations in remove function for bf == -2 and bf == 2 should be opposite
Insert function there is not a criterion such as insert node key already exist what to do?