1
+ #include < iostream>
2
+ #include < queue>
3
+ using namespace std ;
4
+
5
+ struct node
6
+ {
7
+ int data, height;
8
+ node *left, *right;
9
+ };
10
+
11
+ class avl
12
+ {
13
+ node* root=NULL ;
14
+ public:
15
+ int height (node* root){
16
+ if (root)
17
+ return root->height ;
18
+ return 0 ;
19
+ }
20
+ node* rotateLeft (node* root){
21
+ node* newroot = root->right ;
22
+ root->right = newroot->left ;
23
+ newroot->left = root;
24
+ return newroot;
25
+ }
26
+ node* rotateRight (node* root){
27
+ node* newroot = root->left ;
28
+ root->left = newroot->right ;
29
+ newroot->right = root;
30
+ return newroot;
31
+ }
32
+ void insert (int x){
33
+ this ->root = insert (this ->root , x);
34
+ }
35
+ node* insert (node* root, int x){
36
+ if (root==NULL ){
37
+ root = new node;
38
+ root->data = x;
39
+ root->height = 1 ;
40
+ root->left = NULL ;
41
+ root->right = NULL ;
42
+ return root;
43
+ }
44
+ if (x < root->data )
45
+ root->left = insert (root->left ,x);
46
+ else if (x > root->data )
47
+ root->right = insert (root->right ,x);
48
+ else
49
+ return root;
50
+
51
+ int lh = height (root->left ), rh = height (root->right );
52
+ root->height = 1 + max (lh,rh);
53
+
54
+ lh -= rh;
55
+ if (lh>1 ){
56
+ if (x > root->left ->data )
57
+ root->left = rotateLeft (root->left );
58
+ return rotateRight (root);
59
+ }
60
+ else if (lh<-1 ){
61
+ if (x < root->right ->data )
62
+ root->right = rotateRight (root->right );
63
+ return rotateLeft (root);
64
+ }
65
+ return root;
66
+ }
67
+ int minValue (node* root){
68
+ while (root->left )
69
+ root = root->left ;
70
+ return root->data ;
71
+ }
72
+ void remove (int x){
73
+ this ->root = remove (this ->root , x);
74
+ }
75
+ node* remove (node* root, int x){
76
+ if (root == NULL )
77
+ return NULL ;
78
+ if (x < root->data )
79
+ root->left = remove (root->left , x);
80
+ else if (x > root->data )
81
+ root->right = remove (root->right , x);
82
+ else {
83
+ if (root->left == NULL && root->right == NULL ){
84
+ delete root;
85
+ return NULL ;
86
+ }
87
+ else if (root->right == NULL ){
88
+ node* temp = root;
89
+ root = root->left ;
90
+ delete temp;
91
+ return root;
92
+ }
93
+ else if (root->left == NULL ){
94
+ node* temp = root;
95
+ root = root->right ;
96
+ delete temp;
97
+ return root;
98
+ }
99
+ else {
100
+ root->data = minValue (root->right );
101
+ root->right = remove (root->right , root->data );
102
+ }
103
+ }
104
+
105
+ int lh = height (root->left ), rh = height (root->right );
106
+ root->height = 1 + max (lh,rh);
107
+
108
+ lh -= rh;
109
+ if (lh>1 ){
110
+ if (x > root->left ->data )
111
+ root->left = rotateLeft (root->left );
112
+ return rotateRight (root);
113
+ }
114
+ else if (lh<-1 ){
115
+ if (x < root->right ->data )
116
+ root->right = rotateRight (root->right );
117
+ return rotateLeft (root);
118
+ }
119
+ return root;
120
+ }
121
+ void printLevel (){
122
+ printLevel (this ->root );
123
+ }
124
+ void printLevel (node* root){
125
+ if (root){
126
+ queue<node*> q;
127
+ q.push (root);
128
+ q.push (NULL );
129
+ node* temp;
130
+ while (!q.empty ()){
131
+ temp = q.front ();
132
+ q.pop ();
133
+ if (temp){
134
+ cout << temp->data << " " ;
135
+ if (temp->left )
136
+ q.push (temp->left );
137
+ if (temp->right )
138
+ q.push (temp->right );
139
+ }
140
+ else if (q.front ()){
141
+ cout << endl;
142
+ q.push (NULL );
143
+ }
144
+ }
145
+ }
146
+ }
147
+ void print (){
148
+ print (this ->root );
149
+ }
150
+ void print (node* root){
151
+ if (root){
152
+ print (root->left );
153
+ cout << root->data << " " ;
154
+ print (root->right );
155
+ }
156
+ }
157
+ };
158
+
159
+ int main ()
160
+ {
161
+ avl a;
162
+ a.insert (5 );
163
+ a.insert (6 );
164
+ a.insert (7 );
165
+ a.insert (8 );
166
+ a.insert (9 );
167
+ a.insert (4 );
168
+ a.printLevel ();
169
+ a.remove (7 );
170
+ a.remove (5 );
171
+ cout << endl;
172
+ a.printLevel ();
173
+
174
+ return 0 ;
175
+ }
0 commit comments