Estrutura de Dados
AVL – Inserção com Balanceamento
Mailson de Queiroz Proença
1
AVL - Estrutura do nó
struct NO{
int valor, alte, altd;NO *esq, *dir;
};
valor
alte
altd
esq
dir
2
AVL – Inserção
null
0
20
0
null
null
raiz
A árvore está vazia:
Inserção do número 20:
NO *raiz = NULL;raiz = inserir(raiz, numero);
NO* inserir(NO *aux, int num){
NO *novo;if(aux == NULL){
novo = new NO();novo->valor = num;novo->alte = 0;novo->altd = 0;novo->esq = NULL;novo->dir = NULL;aux = novo;
}
150
3
AVL – Inserção
null
1
20
0
120
Inserção do número 40150
null
0
40
0
200
120
NO *raiz = NULL;raiz = inserir(raiz, numero);
NO* inserir(NO *aux, int num){
NO *novo;if(aux == NULL){
novo = new NO();novo->valor = num;novo->alte = 0;novo->altd = 0;novo->esq = NULL;novo->dir = NULL;aux = novo;
} 4
AVL – Inserção
else if(num < aux->valor){
aux->esq = inserir(aux->esq, num);if(aux->esq->altd > aux->esq->alte){
aux->alte = aux->esq->altd + 1;}else
aux->alte = aux->esq->alte + 1;aux = balanceamento(aux);
}else{
aux->dir = inserir(aux->dir, num);if(aux->dir->altd > aux->dir->alte){
aux->altd = aux->dir->altd + 1;}else
aux->altd = aux->dir->alte + 1;aux = balanceamento(aux);
}return aux;}
null
1
20
0
120
Inserção do número 40150
null
0
40
0
200
120
5
AVL – Inserção
NO *raiz = NULL;raiz = inserir(raiz, numero);
NO* inserir(NO *aux, int num){
NO *novo;if(aux == NULL){
novo = new NO();novo->valor = num;novo->alte = 0;novo->altd = 0;novo->esq = NULL;novo->dir = NULL;aux = novo;
}
null
2
20
0
120
Inserção do número 60150
null
1
40
0
200
120
null
0
60
0
null
200
6
AVL – Inserção
null
2
20
0
120
Inserção do número 60
else if(num < aux->valor){
aux->esq = inserir(aux->esq, num);if(aux->esq->altd > aux->esq->alte){
aux->alte = aux->esq->altd + 1;}else
aux->alte = aux->esq->alte + 1;aux = balanceamento(aux);
}else{
aux->dir = inserir(aux->dir, num);if(aux->dir->altd > aux->dir->alte){
aux->altd = aux->dir->altd + 1;}else
aux->altd = aux->dir->alte + 1;aux = balanceamento(aux);
}return aux;}
150
null
1
40
0
200
120
null
0
60
0
null
200
7
AVL – Balanceamento
null
2
20
0
120
150
null
1
40
0
200
120
null
0
60
0
null
200
NO* balanceamento(NO *aux){
int d, df;d = aux->altd - aux->alte;if(d == 2){
df = aux->dir->altd - aux->dir->alte;if(df >= 0)
aux = RotacaoEsquerda(aux);else{
aux->dir = RotacaoDireita(aux->dir);aux = RotacaoEsquerda(aux);}
}else if (d == -2){
df = aux->esq->altd - aux->esq->alte;if(df <= 0)
aux = RotacaoDireita(aux);else{
aux->esq = RotacaoEsquerda(aux->esq);aux = RotacaoDireita(aux);}
}}return aux;
}
Árvore desbalanceada
8
AVL – Rotação Simples à Esquerda
NO* RotacaoEsquerda(NO* pai){
NO *filho = pai->dir;pai->dir = filho->esq;filho->esq = pai;if(pai->dir == NULL)
pai->altd = 0;else if(pai->dir->alte > pai->dir->altd)
pai->altd = pai->dir->alte + 1;else
pai->altd = pai->dir->altd + 1;
if(filho->esq->alte > filho->esq->altd)filho->alte = filho->esq->alte + 1;
elsefilho->alte = filho->esq->altd + 1;
return filho;}
null
0
20
0
null
150
150
1
40
1
200
120
null
0
60
0
null
200
9
AVL – Rotação Simples à Direita
NO* RotacaoDireita(NO* pai){
NO *filho = pai->esq;pai->esq= filho->dir;filho->dir= pai;if(pai->dir == NULL)
pai->altd = 0;else if(pai->dir->alte > pai->dir->altd)
pai->altd = pai->dir->alte + 1;else
pai->altd = pai->dir->altd + 1;
if(filho->esq->alte > filho->esq->altd)filho->alte = filho->esq->alte + 1;
elsefilho->alte = filho->esq->altd + 1;
return filho;}
15
5
10
155
10
10
AVL – Rotação dupla
null
2
20
0
120
150
null
1
60
0
200
120
null
0
40
0
null
200
NO* balanceamento(NO *aux){
int d, df;d = aux->altd - aux->alte;if(d == 2){
df = aux->dir->altd - aux->dir->alte;if(df >= 0)
aux = RotacaoEsquerda(aux);else{
aux->dir = RotacaoDireita(aux->dir);aux = RotacaoEsquerda(aux);}
}else if (d == -2){
df = aux->esq->altd - aux->esq->alte;if(df <= 0)
aux = RotacaoDireita(aux);else{
aux->esq = RotacaoEsquerda(aux->esq);aux = RotacaoDireita(aux);}
}}return aux;
}
Árvore desbalanceada
11
AVL – Rotação Simples à Direita
null
2
20
0
120
150
null
1
60
0
200
120
null
0
40
0
null
200
Árvore desbalanceadaNO* RotacaoDireita(NO* pai){
NO *filho = pai->esq;pai->esq= filho->dir;filho->dir= pai;if(pai->dir == NULL)
pai->altd = 0;else if(pai->dir->alte > pai->dir->altd)
pai->altd = pai->dir->alte + 1;else
pai->altd = pai->dir->altd + 1;
if(filho->esq->alte > filho->esq->altd)filho->alte = filho->esq->alte + 1;
elsefilho->alte = filho->esq->altd + 1;
return filho;}
12
AVL – Rotação Simples à Direita
null
2
20
0
120
150
null
1
40
0
200
120
null
0
60
0
null
200
Árvore desbalanceadaNO* RotacaoDireita(NO* pai){
NO *filho = pai->esq;pai->esq= filho->dir;filho->dir= pai;if(pai->dir == NULL)
pai->altd = 0;else if(pai->dir->alte > pai->dir->altd)
pai->altd = pai->dir->alte + 1;else
pai->altd = pai->dir->altd + 1;
if(filho->esq->alte > filho->esq->altd)filho->alte = filho->esq->alte + 1;
elsefilho->alte = filho->esq->altd + 1;
return filho;}
13
AVL – Rotação Simples à Esquerda
NO* RotacaoEsquerda(NO* pai){
NO *filho = pai->dir;pai->dir = filho->esq;filho->esq = pai;if(pai->dir == NULL)
pai->altd = 0;else if(pai->dir->alte > pai->dir->altd)
pai->altd = pai->dir->alte + 1;else
pai->altd = pai->dir->altd + 1;
if(filho->esq->alte > filho->esq->altd)filho->alte = filho->esq->alte + 1;
elsefilho->alte = filho->esq->altd + 1;
return filho;}
null
0
20
0
null
150
150
1
40
1
200
120
null
0
60
0
null
200
14
FIM
15
Top Related