-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathavl.h
432 lines (347 loc) · 10.6 KB
/
avl.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
#ifndef __AVL_H__
#define __AVL_H__
#include "bintree.h"
#include <functional> // std::less
#include <algorithm>
#include <iostream>
template <typename T , class comparar = std::less<T> >
class AVL{
public:
AVL();
class iterator;
class const_iterator ;
class reverse_iterator;
class const_reverse_iterator;
/*
* @brief insertar un elemento
* @param valor , a insertar
*/
void insert(T valor);
/*
* @brief buscar un elemento
* @param vaolr , a buscar
* @return un pair<iterator,bool>
*/
std::pair<iterator,bool> find(T valor);
/*
* @brief devuelve el primer del avl segun el orden del functor
* @return un iterator que apunta al nodo buscado
*/
iterator begin();
/*
* @brief devuelve el end del AVL
*/
iterator end();
/*
* @brief devuelve el ultimo valor del AVL segun el oreden del functor
* @return un reveres iterator
*/
reverse_iterator rbegin();
/*@brief devuelve el end del AVL
*
*/
reverse_iterator rend();
/*
* @brief devuelve el primer elemento segun el orden del functor
* @return const_iterator
*/
const_iterator cbegin();
/*
* @brief devuelve el end del AVL
*/
const_iterator cend();
/*
* @brief devuelve el ultimo valor del AVL segun el oreden del functor
* @return un const_reveres_iterator
*/
const_reverse_iterator rcbegin();
/*
* @brief devuelve el end del AVL
*/
const_reverse_iterator rcend();
/*
* @brief elimina un elemento , si esta en el avl
* @return 1 si se ha eliminado , 0 en otro caso
*/
unsigned int erase(T valor_a_eliminar);
/*
* @brief devuelve al primer elemento igual o mayor a val
* @param valor a buscar su lower_bound
* @return un iterator
*/
iterator lower_bound (const T val);
/*
* @brief devuelve al primer elemento mayor estricto a val
* @param valor a buscar su upper_bound
* @return un iterator
*/
iterator upper_bound (const T val);
/*
* @brief , este es un metodo que lo utilizo para pintar el arbol "NORMALMENTE NO SE PUEDE CONSTRUIRLA PORQUE ROPME LA PRIVACIDAD DEL AVL "
* @return un bintree
*/
bintree<std::pair<T,int>> el_avl_return() ;
/*
* @brief intercambiar el contenid de 2 avl's
* @param avl_swap el avl que se va intercambiar contenido con this
*/
void swap(AVL<T, comparar> & avl_swap);
/*
* @brief no informa si el avl esta vacio
* @return un bool
*/
bool empty() const;
/*
* @brief devuelve el tamaño del avl
* @return unsigned int
*/
unsigned int size() const;
/*
*@brief limpia el avl "pone el tamano a 0"
*/
void clear();
class reverse_iterator {
public:
/**
@brief Constructor primitivo por defecto.
*/
reverse_iterator();
/**
@brief Constructor de copia.
*/
reverse_iterator(const reverse_iterator & ite);
/**
@brief Operador de incremento.
@pre El BST asociado NO ha sido modificado despu�s
de la creaci�n del iterador receptor.
@pre El iterador receptor NO est� al final del recorrido:
(receptor) != end()
@return Posici�n actual en el recorrido creciente del BST
asociado.
Modifica el (iterador) receptor haci�ndolo apuntar al
siguiente elemento en el recorrido creciente del
BST asociado.
*/
reverse_iterator & operator++();
/**
@brief Obtener el elemento al que apunta el iterator.
@pre El BST asociado NO ha sido modificado despu�s
de la creaci�n del iterador receptor.
@pre El iterador receptor NO est� al final del recorrido:
(receptor) != end()
@return
El par <Key,T> correspondiente al dato de la posici�n actual
del recorrido.
*/
std::pair<T,int> operator*() const;
/**
@brief Comparaci�n de igualdad.
@param i: Segundo iterador en la comparaci�n.
@return true, si el receptor e i tienen el mismo valor.
false, en caso contrario.
*/
bool operator==(const reverse_iterator &i) const;
/**
Comparacion de igualdad.
@param i: Segundo iterador en la comparaci�n.
@return false, si el receptor e i tienen el mismo valor.
true, en caso contrario.
*/
bool operator!=(const reverse_iterator &i) const;
reverse_iterator & operator=(const reverse_iterator &i);
reverse_iterator & operator--();
private:
friend class AVL;
typename bintree<std::pair<T,int> >::node nodo_it;
};
class const_reverse_iterator {
public:
/** @brief constructor por defecto
*/
const_reverse_iterator();
/** @brief constructor de copia
@param[in] it iterator a copiar
*/
const_reverse_iterator(const const_reverse_iterator & it);
/** @brief operador * que devuelve el contendio de donde apunta el iterator
*/
const std::pair<T,int> & operator*() const;
/** @brief operador de incrementar un iterator de forma ++it
incrementa el it en 1
*/
const_reverse_iterator & operator++();
/** @brief operador de decrementar un iterator de forma --it.
deccrementa el it en 1
*/
const_reverse_iterator & operator--();
/** @brief operador de asignacion
@param it a asignar
*/
const_reverse_iterator & operator=(const_reverse_iterator it);
/** @brief operador de comparacion si dos iteradores son iguales
@param it es un operator que se va a comparar con this.
*/
bool operator==(const const_reverse_iterator & it);
/** @brief operador de comparacion si dos iteradores no son iguales
@param it es un operator que se va a comparar con this.
*/
bool operator!=(const const_reverse_iterator & it);
private:
friend class AVL;
typename bintree<std::pair<T,int> >::const_node nodo_it;
};
class iterator {
public:
/**
@brief Constructor primitivo por defecto.
*/
iterator();
/**
@brief Constructor de copia.
*/
iterator(const iterator & ite);
/**
@brief Operador de incremento.
@pre El BST asociado NO ha sido modificado despu�s
de la creaci�n del iterador receptor.
@pre El iterador receptor NO est� al final del recorrido:
(receptor) != end()
@return Posici�n actual en el recorrido creciente del BST
asociado.
Modifica el (iterador) receptor haci�ndolo apuntar al
siguiente elemento en el recorrido creciente del
BST asociado.
*/
iterator & operator++();
/**
@brief Obtener el elemento al que apunta el iterator.
@pre El BST asociado NO ha sido modificado despu�s
de la creaci�n del iterador receptor.
@pre El iterador receptor NO est� al final del recorrido:
(receptor) != end()
@return
El par <Key,T> correspondiente al dato de la posici�n actual
del recorrido.
*/
std::pair<T,int> operator*() const;
/**
@brief Comparaci�n de igualdad.
@param i: Segundo iterador en la comparaci�n.
@return true, si el receptor e i tienen el mismo valor.
false, en caso contrario.
*/
bool operator==(const iterator &i) const;
/**
Comparacion de igualdad.
@param i: Segundo iterador en la comparaci�n.
@return false, si el receptor e i tienen el mismo valor.
true, en caso contrario.
*/
bool operator!=(const iterator &i) const;
iterator & operator=(const iterator &i);
iterator & operator--();
private:
friend class AVL;
typename bintree<std::pair<T,int> >::node nodo_it;
};
class const_iterator {
public:
/** @brief constructor por defecto
*/
const_iterator();
/** @brief constructor de copia
@param[in] it iterator a copiar
*/
const_iterator(const const_iterator & it);
/** @brief Convierte iterator en const_iterator
*/
const_iterator(const iterator & it);
/** @brief operador * que devuelve el contendio de donde apunta el iterator
*/
const std::pair<T,int> & operator*() const;
/** @brief operador de incrementar un iterator de forma ++it
incrementa el it en 1
*/
const_iterator & operator++();
/** @brief operador de decrementar un iterator de forma --it.
deccrementa el it en 1
*/
const_iterator & operator--();
/** @brief operador de asignacion
@param it a asignar
*/
const_iterator & operator=(const_iterator it);
/** @brief operador de comparacion si dos iteradores son iguales
@param it es un operator que se va a comparar con this.
*/
bool operator==(const const_iterator & it);
/** @brief operador de comparacion si dos iteradores no son iguales
@param it es un operator que se va a comparar con this.
*/
bool operator!=(const const_iterator & it);
private:
friend class AVL;
typename bintree<std::pair<T,int> >::const_node nodo_it;
};
private:
// Metodos privados
/*
* @brief rotacion simple a derecha
* @param n el nodo de desequilibrio
*
*/
void RSD(typename bintree<std::pair<T,int> >::node n);
/*
* @brief rotacion simple a izuierda
* @param n el nodo de desequilibrio
*
*/
void RSI(typename bintree<std::pair<T,int> >::node n);
/*
* @brief rotacion doble izquierda derecha
* @param n el nodo de desequilibrio
*
*/
void RDID(typename bintree<std::pair<T,int> >::node n);
/*
* @brief rotacion doble derecha izquierda
* @param n el nodo de desequilibrio
*
*/
void RDDI(typename bintree<std::pair<T,int> >::node n);
/*
* @brief Ajusta la altura de un nodo n
* @param n el nodo para ajusta su altura
*/
void Ajusta_altura(typename bintree<std::pair<T,int> >::node n);
/*
* @brief devuelve la altura de las subarboles derecha , izquierda de un nodo , sucesivamente
* @param n el nodo con el que se va a trabajar
* @return un par de int,int
*/
std::pair<int,int> altura_subarboles_dech_izda_de_un_nodo(typename bintree<std::pair<T,int> >::node n);
/*
* @brief detectar si un nodo esta balanceado o no
* @param n , el nodo que para detectar
* @return un bool
*/
bool es_balanceado(typename bintree<std::pair<T,int> >::node n);
AVL<T,comparar> & operator= (const AVL<T,comparar> & x);
/*
* @brief devuelve la altura de un nodo
* @param n el nodo para sacar su altura
* @return un entero
*/
int h(typename bintree<std::pair<T,int> >::node n);
/*
* @brief devuelve la altura de un nodo
* @param n un nodo constante para sacar su altura
* @return un entero
*/
int h(typename bintree<std::pair<T,int> >::const_node n);
// Representacion
bintree <std::pair<T,int> > el_avl;
unsigned int tama;
comparar cmp;
};
#endif