-
Notifications
You must be signed in to change notification settings - Fork 0
/
ArvoreAVL.cpp
118 lines (105 loc) · 2.22 KB
/
ArvoreAVL.cpp
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
#include <iostream>
#include <stdlib.h>
using namespace std;
template <class Tipo>
class ArvoreAVL {
typedef struct tno{
Tipo num;
int fator;
struct tno *esq;
struct tno *dir;
}tno;
tno* raiz;
public:
ArvoreAVL(){
raiz = NULL;
}
tno** busca(Tipo x){
tno** temp = &raiz;
while(*temp != NULL){
if((*temp) -> num > x) temp = &((*temp) -> esq);
else temp = &((*temp) -> dir);
}
return temp;
}
void insere(Tipo x){
tno** aux = busca(x);
*aux = (tno*)malloc(sizeof(tno));
(*aux)->esq = NULL;
(*aux)->dir = NULL;
(*aux)->fator = 0;
(*aux)->num = x;
}
void insereR(Tipo x){
insereRaux(x, &raiz);
}
int insereRaux(Tipo x, tno** pai){
int aux = 0;
int folha = 0;
if(*pai != NULL){
aux = (*pai)->fator;
if((*pai)->num > x){
folha = insereRaux(x, &((*pai)->esq));
if(folha) (*pai) -> fator = (*pai) -> fator + 1;
}
else{
folha = insereRaux(x, &((*pai)->dir));
if(folha) (*pai) -> fator = (*pai) -> fator - 1;
}
}
else{
*pai = (tno*)malloc(sizeof(tno));
(*pai)->esq = NULL;
(*pai)->dir = NULL;
(*pai)->fator = 0;
(*pai)->num = x;
return 1;
}
if((aux == 0 && (*pai)->fator!= 0)) return 1;
else{
if((*pai)->fator == 2){
if((*pai)->esq->fator == 1) rotacionaDir(pai);
else{
rotacionaEsq(&(*pai)->esq);
rotacionaDir(pai);
}
}else if ((*pai)->fator == -2){
if((*pai)->dir->fator == -1) rotacionaEsq(pai);
else{
rotacionaDir(&(*pai)->dir);
rotacionaEsq(pai);
}
}
return 0;
}
}
void rotacionaDir(tno** pai){
tno* pai2 = *pai;
tno* filho = (*pai)->esq;
pai2->esq = filho->dir;
filho->dir = pai2;
*pai = filho;
pai2->fator = 0;
filho->fator = 0;
}
void rotacionaEsq(tno** pai){
tno* pai2 = *pai;
tno* filho = (*pai)->dir;
pai2->dir = filho->esq;
filho->esq = pai2;
*pai = filho;
pai2->fator = 0;
filho->fator = 0;
}
void printaR(){
printaRaux(raiz, 1);
}
void printaRaux(tno* no, int tab){
if(no != NULL){
cout << "( " << no->num;
printaRaux(no-> esq, tab+1);
printaRaux(no->dir, tab+1);
cout << " )";
}else cout << " () ";
}
};