1
- /* *********************
2
- author: shrutisheoran
3
- ***********************/
4
-
5
1
#include < iostream>
6
2
#include < queue>
7
3
@@ -18,6 +14,8 @@ int max(int a, int b) {
18
14
return a > b ? a : b;
19
15
}
20
16
17
+ // Returns a new Node
18
+
21
19
node* createNode (int data) {
22
20
node *nn = new node ();
23
21
nn->data = data;
@@ -28,20 +26,21 @@ node* createNode(int data) {
28
26
}
29
27
30
28
// Returns height of tree
29
+
31
30
int height (node *root) {
32
31
if (root==NULL )
33
32
return 0 ;
34
33
return 1 + max (height (root->left ), height (root->right ));
35
34
}
36
35
37
36
// Returns difference between height of left and right subtree
37
+
38
38
int getBalance (node *root) {
39
39
return height (root->left ) - height (root->right );
40
40
}
41
41
42
- /* ***********************************
43
- Returns Node after Right Rotation
44
- *************************************/
42
+ // Returns Node after Right Rotation
43
+
45
44
node* rightRotate (node *root) {
46
45
node *t = root->left ;
47
46
node *u = t->right ;
@@ -50,9 +49,8 @@ node* rightRotate(node *root) {
50
49
return t;
51
50
}
52
51
53
- /* ***********************************
54
- Returns Node after Left Rotation
55
- *************************************/
52
+ // Returns Node after Left Rotation
53
+
56
54
node* leftRotate (node *root) {
57
55
node *t = root->right ;
58
56
node *u = t->left ;
@@ -61,9 +59,16 @@ node* leftRotate(node *root) {
61
59
return t;
62
60
}
63
61
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
+
67
72
node* insert (node* root, int item) {
68
73
node *nn = createNode (item);
69
74
if (root == NULL )
@@ -86,9 +91,42 @@ node* insert(node* root, int item) {
86
91
return root;
87
92
}
88
93
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
+
92
130
void levelOrder (node* root) {
93
131
queue<node*> q;
94
132
q.push (root);
@@ -104,12 +142,18 @@ void levelOrder(node* root) {
104
142
}
105
143
106
144
int main () {
107
- node *root = NULL ;
108
145
// Testing AVL Tree
146
+ node *root = NULL ;
109
147
int i;
110
148
for (i = 1 ; i <= 7 ; i++)
111
149
root = insert (root, i);
112
150
cout<<" LevelOrder: " ;
113
151
levelOrder (root);
152
+ root = deleteNode (root, 1 ); // Deleting key with value 1
153
+ cout<<" \n LevelOrder: " ;
154
+ levelOrder (root);
155
+ root = deleteNode (root, 4 ); // Deletin key with value 4
156
+ cout<<" \n LevelOrder: " ;
157
+ levelOrder (root);
114
158
return 0 ;
115
159
}
0 commit comments