AVL – Inserção com Balanceamento

15
Estrutura de Dados AVL – Inserção com Balanceamento Mailson de Queiroz Proença 1

Transcript of AVL – Inserção com Balanceamento

Page 1: AVL – Inserção com Balanceamento

Estrutura de Dados

AVL – Inserção com Balanceamento

Mailson de Queiroz Proença

1

Page 2: AVL – Inserção com Balanceamento

AVL - Estrutura do nó

struct NO{

int valor, alte, altd;NO *esq, *dir;

};

valor

alte

altd

esq

dir

2

Page 3: AVL – Inserção com Balanceamento

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

Page 4: AVL – Inserção com Balanceamento

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

Page 5: AVL – Inserção com Balanceamento

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

Page 6: AVL – Inserção com Balanceamento

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

Page 7: AVL – Inserção com Balanceamento

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

Page 8: AVL – Inserção com Balanceamento

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

Page 9: AVL – Inserção com Balanceamento

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

Page 10: AVL – Inserção com Balanceamento

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

Page 11: AVL – Inserção com Balanceamento

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

Page 12: AVL – Inserção com Balanceamento

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

Page 13: AVL – Inserção com Balanceamento

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

Page 14: AVL – Inserção com Balanceamento

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

Page 15: AVL – Inserção com Balanceamento

FIM

15