-
Notifications
You must be signed in to change notification settings - Fork 0
/
Header.h
109 lines (102 loc) · 2.71 KB
/
Header.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
#include<iostream>
#include<string>
using namespace std;
template<class A,class B,class C,class D,class E,class F,class G,class H>
class Nodo {
private:
A numdenuencia;
B agraviado;
C dniagraviado;
D agresor;
E dniagresor;
F tipodelito;
G gravedad;
H testimonio;
Nodo<A, B, C, D, E, F, G,H>*izquierda;
Nodo<A, B, C, D, E, F, G,H>*derecha;
int altura;
public:
Nodo() {
izquierda = nullptr;
derecha = nullptr;
altura = 0;
}
};
template<class A, class B, class C, class D, class E, class F, class G,class H>
class ArbolAVL{
private:
Nodo<A, B, C, D, E, F, G,H>* raiz;
void(*procesar)(A, B, C, D, E, F, G,H);
int _altura(Nodo<A, B, C, D, E, F, G,H>* nodo) {
if (nodo == nullptr) return 0;
return nodo->altura;
}
void _rotarDerecha(Nodo<A, B, C, D, E, F, G,H>*& nodo) {
Nodo<A, B, C, D, E, F, G,H>* p = nodo->izq;
nodo->izq = p->der;
p->der = nodo;
nodo = p;
}
void _rotarIzquierda(Nodo<A, B, C, D, E, F, G,H>*& nodo) {
Nodo<A, B, C, D, E, F, G,H>* p = nodo->der;
nodo->der = p->izq;
p->izq = nodo;
nodo = p;
}
void _balanceo(Nodo<A, B, C, D, E, F, G,H>*& nodo) {
int hizq = _altura(nodo->izq);
int hder = _altura(nodo->der);
int fb = hder - hizq;
if (fb > 1) {
int hhizq = _altura(nodo->der->izq);
int hhder = _altura(nodo->der->der);
if (hhizq > hhder) {
_rotarDerecha(nodo->der);
}
_rotarIzquierda(nodo);
}
if (fb < -1) {
int hhizq = _altura(nodo->izq->izq);
int hhder = _altura(nodo->izq->der);
if (hhizq < hhder) {
_rotarIzquierda(nodo->izq);
}
_rotarDerecha(nodo);
}
hizq = _altura(nodo->izq);
hder = _altura(nodo->der);
nodo->altura = 1 + ((hizq > hder) ? hizq : hder);
}
bool _insertar(Nodo<A, B, C, D, E, F, G,H>*& nodo, A id ,B agra, C dniagra, D agre, E dniagre, F tipo, G grave, H testio) {
if (nodo == nullptr) {
nodo = new Nodo<A, B, C, D, E, F, G,H>();
nodo->numdenuencia = id;
nodo->agraviado = dniagra;
nodo->dniagraviado = dniagra;
nodo->agresor = agre;
nodo->dniagresor = dniagre;
nodo->tipodelito = tipo;
nodo->gravedad = grave;
nodo->testimonio = testio;
return true;
}
else if (id == nodo->elemento)
return false;
else if (id < nodo->elemento) {
_insertar(nodo->izq, id);
}
else if (id > nodo->elemento) {
_insertar(nodo->der, id);
}
_balanceo(nodo);
return true;
}
public:
ArbolAVL(void(*nuevaFuncion)(A, B, C, D, E, F, G, H)) {
this->procesar = nuevaFuncion;
this->raiz = nullptr;
}
bool Insertar(A id, B agra, C dniagra, D agre, E dniagre, F tipo, G grave, H testio) {
return _insertar(raiz,id,agra,dniagra,agre,dniagre,tipo,grave,testio);
}
};