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

PPTX
Best secondary school in tanzania
PPTX
Presentacion tarea 3
PDF
1986 orden de 27 de marzo contratación laboral temporal personal de investiga...
PPTX
Beneficios del Comercio Electrónico en las Mipymes
PPTX
Marilyn pineda hd
PDF
Posturi complete viabilitate cel putin 4 ani arges 07.03.2016 edu.ro
PPTX
Presentación viviana calderini
PPT
fatec ponto de venda remoto
Best secondary school in tanzania
Presentacion tarea 3
1986 orden de 27 de marzo contratación laboral temporal personal de investiga...
Beneficios del Comercio Electrónico en las Mipymes
Marilyn pineda hd
Posturi complete viabilitate cel putin 4 ani arges 07.03.2016 edu.ro
Presentación viviana calderini
fatec ponto de venda remoto

Destaque (8)

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

Último (13)

PDF
SLIDES - AULA 3 - CLASSES E OBJETOS EM JAVA - Material de Cleyton Souza - IFPB
PPT
03_slide de Gerenciamento de Projetos .ppt
PPT
00_Apresentacao sobre o livro do sommerville_ES.ppt
PDF
SLIDES - AULA 2 - INTRODUÇÃO - Material de Cleyton Souza - IFPB
PPT
09_Evolucao de software e_Refatoracao.ppt
PDF
SLIDES - AULA 5 - HERANÇA - Material de Cleyton Souza - IFPB
PDF
SLIDES - AULA 1 - APRESENTAÇÃO - Material de Cleyton Souza - IFPB
PPT
04_slide Requisitos de software_capitulo4
PPT
05_slide especificacao de sistemas de software e a uml UML.ppt
PPT
10_ slides de Reuso sommerville cap 10.ppt
PDF
SLIDES - AULA 7 - SWING - Cleyton Souza - IFPB
PPT
07_slides de Estilos_Arquiteturais sommerville.ppt
PPT
06_slide de Arquitetura_de_Software .ppt
SLIDES - AULA 3 - CLASSES E OBJETOS EM JAVA - Material de Cleyton Souza - IFPB
03_slide de Gerenciamento de Projetos .ppt
00_Apresentacao sobre o livro do sommerville_ES.ppt
SLIDES - AULA 2 - INTRODUÇÃO - Material de Cleyton Souza - IFPB
09_Evolucao de software e_Refatoracao.ppt
SLIDES - AULA 5 - HERANÇA - Material de Cleyton Souza - IFPB
SLIDES - AULA 1 - APRESENTAÇÃO - Material de Cleyton Souza - IFPB
04_slide Requisitos de software_capitulo4
05_slide especificacao de sistemas de software e a uml UML.ppt
10_ slides de Reuso sommerville cap 10.ppt
SLIDES - AULA 7 - SWING - Cleyton Souza - IFPB
07_slides de Estilos_Arquiteturais sommerville.ppt
06_slide de Arquitetura_de_Software .ppt
Anúncio

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