SlideShare uma empresa Scribd logo
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 40
150
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 40
150
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 60
150
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;
else
filho->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;
else
filho->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 desbalanceada
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;
else
filho->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 desbalanceada
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;
else
filho->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;
else
filho->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

Mais conteúdo relacionado

Destaque

Elearning Summit 2015 - BoSCO - Minneapolis
Elearning Summit 2015 - BoSCO - MinneapolisElearning Summit 2015 - BoSCO - Minneapolis
Elearning Summit 2015 - BoSCO - Minneapolis
University of Minnesota Rochester
 
Actividades del i 4
Actividades del i 4Actividades del i 4
Actividades del i 4
romanbellon
 
3...2...1... Presentación.
3...2...1... Presentación.3...2...1... Presentación.
3...2...1... Presentación.
AdrianInformatica
 
Digital Humanities and the Future of Universities [Prof. Pier Luigi Sacco]
Digital Humanities and the Future of Universities [Prof. Pier Luigi Sacco]Digital Humanities and the Future of Universities [Prof. Pier Luigi Sacco]
Digital Humanities and the Future of Universities [Prof. Pier Luigi Sacco]
Studia nových médii, FF UK, Praha
 
Global insulin patch market opportunity analysis
Global insulin patch market opportunity analysisGlobal insulin patch market opportunity analysis
Global insulin patch market opportunity analysis
KuicK Research
 
The Visual Terminator
The Visual TerminatorThe Visual Terminator
The Visual Terminator
Michele Lanza
 
Msr2016 tarek
Msr2016 tarek Msr2016 tarek
Msr2016 tarek
swy351
 
PPT on INPUT & OUTPUT DEVICES
PPT on INPUT & OUTPUT DEVICESPPT on INPUT & OUTPUT DEVICES
PPT on INPUT & OUTPUT DEVICES
Harsh Raj
 

Destaque (8)

Elearning Summit 2015 - BoSCO - Minneapolis
Elearning Summit 2015 - BoSCO - MinneapolisElearning Summit 2015 - BoSCO - Minneapolis
Elearning Summit 2015 - BoSCO - Minneapolis
 
Actividades del i 4
Actividades del i 4Actividades del i 4
Actividades del i 4
 
3...2...1... Presentación.
3...2...1... Presentación.3...2...1... Presentación.
3...2...1... Presentación.
 
Digital Humanities and the Future of Universities [Prof. Pier Luigi Sacco]
Digital Humanities and the Future of Universities [Prof. Pier Luigi Sacco]Digital Humanities and the Future of Universities [Prof. Pier Luigi Sacco]
Digital Humanities and the Future of Universities [Prof. Pier Luigi Sacco]
 
Global insulin patch market opportunity analysis
Global insulin patch market opportunity analysisGlobal insulin patch market opportunity analysis
Global insulin patch market opportunity analysis
 
The Visual Terminator
The Visual TerminatorThe Visual Terminator
The Visual Terminator
 
Msr2016 tarek
Msr2016 tarek Msr2016 tarek
Msr2016 tarek
 
PPT on INPUT & OUTPUT DEVICES
PPT on INPUT & OUTPUT DEVICESPPT on INPUT & OUTPUT DEVICES
PPT on INPUT & OUTPUT DEVICES
 

AVL – Inserção com Balanceamento

  • 1. Estrutura de Dados AVL – Inserção com Balanceamento Mailson de Queiroz Proença 1
  • 2. AVL - Estrutura do nó struct NO { int valor, alte, altd; NO *esq, *dir; }; valor alte altd esq dir 2
  • 3. 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
  • 4. AVL – Inserção null 1 20 0 120 Inserção do número 40 150 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
  • 5. 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 40 150 null 0 40 0 200 120 5
  • 6. 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 60 150 null 1 40 0 200 120 null 0 60 0 null 200 6
  • 7. 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
  • 8. 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
  • 9. 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; else filho->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
  • 10. 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; else filho->alte = filho->esq->altd + 1; return filho; } 15 5 10 155 10 10
  • 11. 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
  • 12. AVL – Rotação Simples à Direita null 2 20 0 120 150 null 1 60 0 200 120 null 0 40 0 null 200 Árvore desbalanceada 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; else filho->alte = filho->esq->altd + 1; return filho; } 12
  • 13. AVL – Rotação Simples à Direita null 2 20 0 120 150 null 1 40 0 200 120 null 0 60 0 null 200 Árvore desbalanceada 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; else filho->alte = filho->esq->altd + 1; return filho; } 13
  • 14. 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; else filho->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