Skip to content

Commit b204b5e

Browse files
authored
Merge pull request #136 from shrutisheoran/AVLTree_shrutisheoran
Add deletion function
2 parents 8e924d7 + e34368f commit b204b5e

File tree

1 file changed

+61
-17
lines changed

1 file changed

+61
-17
lines changed

Datastructures/AVLtree.cpp

Lines changed: 61 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
/**********************
2-
author: shrutisheoran
3-
***********************/
4-
51
#include <iostream>
62
#include <queue>
73

@@ -18,6 +14,8 @@ int max(int a, int b) {
1814
return a > b ? a : b;
1915
}
2016

17+
// Returns a new Node
18+
2119
node* createNode(int data) {
2220
node *nn = new node();
2321
nn->data = data;
@@ -28,20 +26,21 @@ node* createNode(int data) {
2826
}
2927

3028
// Returns height of tree
29+
3130
int height(node *root) {
3231
if(root==NULL)
3332
return 0;
3433
return 1 + max(height(root->left), height(root->right));
3534
}
3635

3736
// Returns difference between height of left and right subtree
37+
3838
int getBalance(node *root) {
3939
return height(root->left) - height(root->right);
4040
}
4141

42-
/************************************
43-
Returns Node after Right Rotation
44-
*************************************/
42+
// Returns Node after Right Rotation
43+
4544
node* rightRotate(node *root) {
4645
node *t = root->left;
4746
node *u = t->right;
@@ -50,9 +49,8 @@ node* rightRotate(node *root) {
5049
return t;
5150
}
5251

53-
/************************************
54-
Returns Node after Left Rotation
55-
*************************************/
52+
// Returns Node after Left Rotation
53+
5654
node* leftRotate(node *root) {
5755
node *t = root->right;
5856
node *u = t->left;
@@ -61,9 +59,16 @@ node* leftRotate(node *root) {
6159
return t;
6260
}
6361

64-
/************************
65-
Balanced Insertion
66-
************************/
62+
// Returns node with minimum value in the tree
63+
64+
node* minValue(node* root) {
65+
if(root->left==NULL)
66+
return root;
67+
return minValue(root->left);
68+
}
69+
70+
// Balanced Insertion
71+
6772
node* insert(node* root, int item) {
6873
node *nn = createNode(item);
6974
if(root == NULL)
@@ -86,9 +91,42 @@ node* insert(node* root, int item) {
8691
return root;
8792
}
8893

89-
/**************************************
90-
LevelOrder (Breadth First Search)
91-
*************************************/
94+
// Balanced Deletion
95+
96+
node* deleteNode(node *root, int key) {
97+
if(root == NULL)
98+
return root;
99+
if(key < root->data)
100+
root->left = deleteNode(root->left, key);
101+
else if(key > root->data)
102+
root->right = deleteNode(root->right, key);
103+
104+
else {
105+
// Node to be deleted is leaf node or have only one Child
106+
if(!root->right) {
107+
node* temp = root->left;
108+
delete(root);
109+
root = NULL;
110+
return temp;
111+
}
112+
else if(!root->left) {
113+
node* temp = root->right;
114+
delete(root);
115+
root = NULL;
116+
return temp;
117+
}
118+
// Node to be deleted have both left and right subtrees
119+
node *temp = minValue(root->right);
120+
root->data = temp->data;
121+
root->right = deleteNode(root->right, temp->data);
122+
}
123+
// Balancing Tree after deletion
124+
return root;
125+
}
126+
127+
128+
// LevelOrder (Breadth First Search)
129+
92130
void levelOrder(node* root) {
93131
queue<node*> q;
94132
q.push(root);
@@ -104,12 +142,18 @@ void levelOrder(node* root) {
104142
}
105143

106144
int main() {
107-
node *root = NULL;
108145
// Testing AVL Tree
146+
node *root = NULL;
109147
int i;
110148
for(i = 1 ; i <= 7 ; i++)
111149
root = insert(root, i);
112150
cout<<"LevelOrder: ";
113151
levelOrder(root);
152+
root = deleteNode(root, 1); // Deleting key with value 1
153+
cout<<"\nLevelOrder: ";
154+
levelOrder(root);
155+
root = deleteNode(root, 4); // Deletin key with value 4
156+
cout<<"\nLevelOrder: ";
157+
levelOrder(root);
114158
return 0;
115159
}

0 commit comments

Comments
 (0)