Árvores AVLtiagodemelo.info/wp-content/uploads/2020/09/arvores-avl... · 2020. 9. 22. · O...
Transcript of Árvores AVLtiagodemelo.info/wp-content/uploads/2020/09/arvores-avl... · 2020. 9. 22. · O...
Algoritmos e Estruturas de Dados I
Árvores AVLProf. Tiago Eugenio de Melo
www.tiagodemelo.info
Observações
● O conteúdo dessa aula é parcialmente proveniente do Capítulo 14 do livro “Data Structure and Algorithms Using Python”.
● As palavras com a fonte Courier indicam uma palavra-reservada da linguagem de programação.
2 / 40
Árvores AVL
3 / 40
Introdução
4 / 40
Introdução
● Árvore binária de busca (ABB) é uma estrutura de dados apropriada para armazenamento e pesquisa (busca) de dados.
4 / 40
Introdução
● Árvore binária de busca (ABB) é uma estrutura de dados apropriada para armazenamento e pesquisa (busca) de dados.
● A eficiência das operações em ABB depende bastante da altura da árvore.
4 / 40
Introdução
● Árvore binária de busca (ABB) é uma estrutura de dados apropriada para armazenamento e pesquisa (busca) de dados.
● A eficiência das operações em ABB depende bastante da altura da árvore.
● No melhor caso, uma árvore binária de busca terá altura de log n.
4 / 40
Introdução
● Árvore binária de busca (ABB) é uma estrutura de dados apropriada para armazenamento e pesquisa (busca) de dados.
● A eficiência das operações em ABB depende bastante da altura da árvore.
● No melhor caso, uma árvore binária de busca terá altura de log n.
● No pior caso, a altura da árvore será n.
4 / 40
Introdução
● Árvore binária de busca (ABB) é uma estrutura de dados apropriada para armazenamento e pesquisa (busca) de dados.
● A eficiência das operações em ABB depende bastante da altura da árvore.
● No melhor caso, uma árvore binária de busca terá altura de log n.
● No pior caso, a altura da árvore será n.● Assim, devemos buscar construir uma ABB que tenha
altura de log n.
4 / 40
Introdução
5 / 40
Introdução
● Como construir uma ABB com altura log n?
5 / 40
Introdução
● Como construir uma ABB com altura log n?– Se conhecessemos a lista completa de chaves.
5 / 40
Introdução
● Como construir uma ABB com altura log n?– Se conhecessemos a lista completa de chaves.
● Bastaria deixar a lista ordenada e usar a técnica de busca binária.
5 / 40
Introdução
● Como construir uma ABB com altura log n?– Se conhecessemos a lista completa de chaves.
● Bastaria deixar a lista ordenada e usar a técnica de busca binária.
● O problema é que essa técnica exige conhecer antecipadamente todas as chaves e isso não se aplica a muitos problemas reais.
5 / 40
Introdução
● Como construir uma ABB com altura log n?– Se conhecessemos a lista completa de chaves.
● Bastaria deixar a lista ordenada e usar a técnica de busca binária.
● O problema é que essa técnica exige conhecer antecipadamente todas as chaves e isso não se aplica a muitos problemas reais.
– Nós poderíamos reconstruir a árvore a cada nó que seja adicionado ou removido da árvore.
5 / 40
Introdução
● Como construir uma ABB com altura log n?– Se conhecessemos a lista completa de chaves.
● Bastaria deixar a lista ordenada e usar a técnica de busca binária.
● O problema é que essa técnica exige conhecer antecipadamente todas as chaves e isso não se aplica a muitos problemas reais.
– Nós poderíamos reconstruir a árvore a cada nó que seja adicionado ou removido da árvore.
● Mas o tempo para fazer isso torna inviável essa alternativa.
5 / 40
Introdução
● Como construir uma ABB com altura log n?– Se conhecessemos a lista completa de chaves.
● Bastaria deixar a lista ordenada e usar a técnica de busca binária.
● O problema é que essa técnica exige conhecer antecipadamente todas as chaves e isso não se aplica a muitos problemas reais.
– Nós poderíamos reconstruir a árvore a cada nó que seja adicionado ou removido da árvore.
● Mas o tempo para fazer isso torna inviável essa alternativa.
– O que nós precisamos fazer é manter a árvore com uma altura ideal à medida que novos elementos sejam adicionados ou antigos sejam removidos. 5 / 40
AVL
6 / 40
AVL
● A árvore AVL foi inventada por G. M. Adel'son-Velskii e Y. M. Landis em 1962.
6 / 40
AVL
● A árvore AVL foi inventada por G. M. Adel'son-Velskii e Y. M. Landis em 1962.
● O objetivo dessa árvore é garantir que a altura da árvore esteja sempre balanceada.
6 / 40
AVL
7 / 40
AVL
● Uma ABB é AVL se as alturas das subárvores a esquerda e a direita para cada um dos nós variem apenas de 1.
7 / 40
AVL
● Uma ABB é AVL se as alturas das subárvores a esquerda e a direita para cada um dos nós variem apenas de 1.
● Exemplos de árvore AVL:
7 / 40
AVL
● Uma ABB é AVL se as alturas das subárvores a esquerda e a direita para cada um dos nós variem apenas de 1.
● Exemplos de árvore AVL:
7 / 40
AVL
● Uma ABB é AVL se as alturas das subárvores a esquerda e a direita para cada um dos nós variem apenas de 1.
● Exemplos de árvore AVL:
7 / 40
AVL
● Exemplo de árvore que não é AVL:
8 / 40
AVL
● Exemplo de árvore que não é AVL:
8 / 40
AVL
● Exemplo de árvore que não é AVL:
8 / 40
AVL
● Exemplo de árvore que não é AVL:
ALTURA = 38 / 40
AVL
● Exemplo de árvore que não é AVL:
ALTURA = 38 / 40
AVL
● Exemplo de árvore que não é AVL:
ALTURA = 3
ALTURA = 1
8 / 40
AVL
9 / 40
AVL
● As operações de busca e de travessia são iguais nas árvores binárias de busca e nas AVL.
9 / 40
AVL
● As operações de busca e de travessia são iguais nas árvores binárias de busca e nas AVL.
● As operações de inserção e remoção devem ser modificadas para manter a propriedade de balanceamento das AVL.
9 / 40
Inserção
10 / 40
Inserção
● A inserção na AVL inicia com o mesmo procedimento usado nas ABB.
10 / 40
Inserção
● A inserção na AVL inicia com o mesmo procedimento usado nas ABB.
● Nós pesquisamos por uma chave na árvore e adicionamos o novo elemento onde ocorre a “falha” na busca.
10 / 40
Inserção
● A inserção na AVL inicia com o mesmo procedimento usado nas ABB.
● Nós pesquisamos por uma chave na árvore e adicionamos o novo elemento onde ocorre a “falha” na busca.
● Quando um novo elemento é inserido na AVL, a propriedade de balanceamento deve ser mantida.
10 / 40
Inserção
● A inserção na AVL inicia com o mesmo procedimento usado nas ABB.
● Nós pesquisamos por uma chave na árvore e adicionamos o novo elemento onde ocorre a “falha” na busca.
● Quando um novo elemento é inserido na AVL, a propriedade de balanceamento deve ser mantida.
● Se a inserção de um novo elemento causar um desbalanceamento, então a árvore deverá ser rebalanceada.
10 / 40
Inserção
11 / 40
Inserção
● Considere que vamos inserir o elemento 120 na árvore abaixo:
11 / 40
Inserção
● Considere que vamos inserir o elemento 120 na árvore abaixo:
60
100
80
25
17 35
30 11 / 40
Inserção
● Considere que vamos inserir o elemento 120 na árvore abaixo:
60
100
80
25
17 35
30 11 / 40
Inserção
● Considere que vamos inserir o elemento 120 na árvore abaixo:
120
60
100
80
25
17 35
30 11 / 40
Inserção
● Considere que vamos inserir o elemento 120 na árvore abaixo:
120
60
100
80
25
17 35
30
120
11 / 40
Inserção
● Considere que vamos inserir o elemento 120 na árvore abaixo:
120
60
100
80
25
17 35
30
120
A árvore continua balanceada?
11 / 40
Inserção
12 / 40
Inserção
● Considere que vamos inserir o elemento 28 na árvore abaixo:
12 / 40
Inserção
● Considere que vamos inserir o elemento 28 na árvore abaixo:
120
60
100
80
25
17 35
30
12 / 40
Inserção
● Considere que vamos inserir o elemento 28 na árvore abaixo:
120
60
100
80
25
17 35
30
12 / 40
Inserção
● Considere que vamos inserir o elemento 28 na árvore abaixo:
120
60
100
80
25
17 35
30
28 12 / 40
Inserção
● Considere que vamos inserir o elemento 28 na árvore abaixo:
120
60
100
80
25
17 35
30
28
A árvore continua balanceada?
12 / 40
Inserção
13 / 40
Inserção
● Como a árvore ficaria balanceada?
13 / 40
Inserção
● Como a árvore ficaria balanceada?
120
60
100
80
25
17 35
30
28 13 / 40
Inserção
● Como a árvore ficaria balanceada?
120
60
100
80
25
17 35
30
28
60
13 / 40
Inserção
● Como a árvore ficaria balanceada?
120
60
100
80
25
17 35
30
28
60
13 / 40
Inserção
● Como a árvore ficaria balanceada?
120
60
100
80
25
17 35
30
28
60
13 / 40
Inserção
● Como a árvore ficaria balanceada?
120
60
100
80
25
17 35
30
28
60
25
13 / 40
Inserção
● Como a árvore ficaria balanceada?
120
60
100
80
25
17 35
30
28
60
10025
13 / 40
Inserção
● Como a árvore ficaria balanceada?
120
60
100
80
25
17 35
30
28
60
10025
13 / 40
Inserção
● Como a árvore ficaria balanceada?
120
60
100
80
25
17 35
30
28
60
10025
13 / 40
Inserção
● Como a árvore ficaria balanceada?
120
60
100
80
25
17 35
30
28
60
10025
13 / 40
Inserção
● Como a árvore ficaria balanceada?
120
60
100
80
25
17 35
30
28
60
10025
13 / 40
Inserção
● Como a árvore ficaria balanceada?
120
60
100
80
25
17 35
30
28
60
10025
17
13 / 40
Inserção
● Como a árvore ficaria balanceada?
120
60
100
80
25
17 35
30
28
60
10025
17 30
13 / 40
Inserção
● Como a árvore ficaria balanceada?
120
60
100
80
25
17 35
30
28
60
100
80
25
17 30
13 / 40
Inserção
● Como a árvore ficaria balanceada?
120
60
100
80
25
17 35
30
28
120
60
100
80
25
17 30
13 / 40
Inserção
● Como a árvore ficaria balanceada?
120
60
100
80
25
17 35
30
28
120
60
100
80
25
17 30
13 / 40
Inserção
● Como a árvore ficaria balanceada?
120
60
100
80
25
17 35
30
28
120
60
100
80
25
17 30
13 / 40
Inserção
● Como a árvore ficaria balanceada?
120
60
100
80
25
17 35
30
28
120
60
100
80
25
17 30
28
13 / 40
Inserção
● Como a árvore ficaria balanceada?
120
60
100
80
25
17 35
30
28
120
60
100
80
25
17 30
28 35
13 / 40
Inserção
14 / 40
Inserção
● É possível que múltiplas subárvores se tornem desbalanceadas depois da inserção de um novo elemento.
14 / 40
Inserção
● É possível que múltiplas subárvores se tornem desbalanceadas depois da inserção de um novo elemento.
● Porém, somente o nó raiz mais próximo do novo elemento terá que ser rotacionado.
14 / 40
Inserção
● É possível que múltiplas subárvores se tornem desbalanceadas depois da inserção de um novo elemento.
● Porém, somente o nó raiz mais próximo do novo elemento terá que ser rotacionado.
● Esse elemento que deverá ser rotacionado é chamado de nó pivot.
14 / 40
Inserção
● É possível que múltiplas subárvores se tornem desbalanceadas depois da inserção de um novo elemento.
● Porém, somente o nó raiz mais próximo do novo elemento terá que ser rotacionado.
● Esse elemento que deverá ser rotacionado é chamado de nó pivot.
● Portanto, nó pivô é aquele que após a inserção possui fator de balanceamento fora do intervalo.
14 / 40
Inserção
● É possível que múltiplas subárvores se tornem desbalanceadas depois da inserção de um novo elemento.
● Porém, somente o nó raiz mais próximo do novo elemento terá que ser rotacionado.
● Esse elemento que deverá ser rotacionado é chamado de nó pivot.
● Portanto, nó pivô é aquele que após a inserção possui fator de balanceamento fora do intervalo.
● Uma subárvore AVL é rebalanceada ao executarmos uma rotação em volta desse pivot.
● Existem quatro casos de rotação do pivot.
14 / 40
Inserção
15 / 40
Inserção
● Caso 1
15 / 40
Inserção
● Caso 1– Ocorre quando o fator de balanço do lado esquerdo
do nó pivot (P) é maior e o novo elemento é inserido no lado do filho esquerdo (C) do pivot.
15 / 40
Inserção
● Caso 1– Ocorre quando o fator de balanço do lado esquerdo
do nó pivot (P) é maior e o novo elemento é inserido no lado do filho esquerdo (C) do pivot.
15 / 40
Inserção
● Caso 1– Ocorre quando o fator de balanço do lado esquerdo
do nó pivot (P) é maior e o novo elemento é inserido no lado do filho esquerdo (C) do pivot.
15 / 40
Inserção
● Caso 1– Ocorre quando o fator de balanço do lado esquerdo
do nó pivot (P) é maior e o novo elemento é inserido no lado do filho esquerdo (C) do pivot.
Fator de balanço = 4 - 1
15 / 40
Inserção
● Caso 1– Ocorre quando o fator de balanço do lado esquerdo
do nó pivot (P) é maior e o novo elemento é inserido no lado do filho esquerdo (C) do pivot.
Fator de balanço = 4 - 1
Fator de balanço = 3 - 1
15 / 40
Inserção
● Caso 1– Ocorre quando o fator de balanço do lado esquerdo
do nó pivot (P) é maior e o novo elemento é inserido no lado do filho esquerdo (C) do pivot.
Fator de balanço = 4 - 1
Fator de balanço = 3 - 1
Quem será o pivot?
15 / 40
Inserção
● Caso 1– Ocorre quando o fator de balanço do lado esquerdo
do nó pivot (P) é maior e o novo elemento é inserido no lado do filho esquerdo (C) do pivot.
Fator de balanço = 4 - 1
Fator de balanço = 3 - 1
Quem será o pivot?
15 / 40
Inserção
● Caso 1– Ocorre quando o fator de balanço do lado esquerdo
do nó pivot (P) é maior e o novo elemento é inserido no lado do filho esquerdo (C) do pivot.
Fator de balanço = 4 - 1
Fator de balanço = 3 - 1
Quem será o pivot?
pivot
15 / 40
Inserção
16 / 40
Inserção
ANTES
16 / 40
Inserção
P
CS3 h
S2 hS1h
ANTES
16 / 40
Inserção
P
CS3 h
S2 hS1h
ANTES DEPOIS
16 / 40
Inserção
P
CS3 h
S2 hS1h
P
CS3 h
S2 hS1
ANTES DEPOIS
16 / 40
Inserção
P
CS3 h
S2 hS1h
P
CS3 h
S2 hS1
novo nó
ANTES DEPOIS
16 / 40
Inserção
P
CS3 h
S2 hS1h h+1
P
CS3 h
S2 hS1
novo nó
ANTES DEPOIS
16 / 40
Inserção
17 / 40
Inserção
● O nó pivot deve ser rotacionado para direita do seu filho à esquerda.
17 / 40
Inserção
● O nó pivot deve ser rotacionado para direita do seu filho à esquerda.
● P se torna o filho à direita de C e o filho à direita de C se torna o filho à esquerda de P.
17 / 40
Inserção
18 / 40
Inserção
ANTES
18 / 40
Inserção
h+1
P
CS3 h
S2 hS1
novo nó
ANTES
18 / 40
Inserção
DEPOIS
h+1
P
CS3 h
S2 hS1
novo nó
ANTES
18 / 40
Inserção
DEPOIS
h+1
P
CS3 h
S2 hS1
novo nó
ANTES
h+1
C
S2 hS1
novo nóS3
P
18 / 40
Inserção
● Exemplo Caso 1
19 / 40
Inserção
● Exemplo Caso 1
ANTES
19 / 40
Inserção
● Exemplo Caso 1
ANTES
19 / 40
Inserção
● Exemplo Caso 1
ANTES
19 / 40
Inserção
● Exemplo Caso 1
ANTES DEPOIS
19 / 40
Inserção
● Exemplo Caso 1
ANTES DEPOIS
19 / 40
Inserção
● Caso 2
20 / 40
Inserção
● Caso 2– Este caso envolve três nós: pivot (P), o seu filho à
esquerda (C) e o filho deste à direita (G).
20 / 40
Inserção
● Caso 2– Este caso envolve três nós: pivot (P), o seu filho à
esquerda (C) e o filho deste à direita (G).– Para este caso ocorrer, o fator de balanço à
esquerda (C) do nó pivot (P) é maior e o novo elemento é inserido do lado direito de C.
20 / 40
Inserção
● Caso 2
21 / 40
Inserção
● Caso 2
P
Ch
h GS1
h-1 S2 h-1S3
S4
21 / 40
Inserção
● Caso 2
P
Ch
h GS1
h-1 S2 h-1S3
S4
P
Ch
h GS1
h-1 S2 h-1S3
S4
21 / 40
Inserção
● Caso 2
P
Ch
h GS1
h-1 S2 h-1S3
S4
P
Ch
h GS1
h-1 S2 h-1S3
S4
nó21 / 40
Inserção
● Caso 2
P
Ch
h GS1
h-1 S2 h-1S3
S4
P
Ch
h GS1
h-1 S2 h-1S3
S4
nó nó21 / 40
Inserção
● Caso 2
P
Ch
h GS1
h-1 S2 h-1S3
S4
nó nó22 / 40
Inserção
● Caso 2– Serão necessárias duas rotações. P
Ch
h GS1
h-1 S2 h-1S3
S4
nó nó22 / 40
Inserção
● Caso 2– Serão necessárias duas rotações.– Nó G deve ser rotacionado.
P
Ch
h GS1
h-1 S2 h-1S3
S4
nó nó22 / 40
Inserção
● Caso 2– Serão necessárias duas rotações.– Nó G deve ser rotacionado.
P
Ch
h GS1
h-1 S2 h-1S3
S4
nó nó22 / 40
Inserção
● Caso 2– Serão necessárias duas rotações.– Nó G deve ser rotacionado.– O nó pivot P será rotacionado.
P
Ch
h GS1
h-1 S2 h-1S3
S4
nó nó22 / 40
Inserção
● Caso 2– Serão necessárias duas rotações.– Nó G deve ser rotacionado.– O nó pivot P será rotacionado.
P
Ch
h GS1
h-1 S2 h-1S3
S4
nó nó22 / 40
Inserção
● Caso 2
P
Ch
h GS1
h-1 S2 h-1S3
S4
nó23 / 40
Inserção
● Caso 2
P
Ch
h GS1
h-1 S2 h-1S3
S4
nó nó23 / 40
Inserção
● Caso 2
h-1 S3 hS4
nó
G
P
h S1 h-1S2
nó
C
P
Ch
h GS1
h-1 S2 h-1S3
S4
nó nó23 / 40
Inserção
● Caso 2
24 / 40
Inserção
● Caso 2
24 / 40
Inserção
● Caso 2
P
24 / 40
Inserção
● Caso 2
P
C
24 / 40
Inserção
● Caso 2
P
C
G
24 / 40
Inserção
● Caso 2
P
C
G
24 / 40
Inserção
● Caso 2
P
C
G
G
24 / 40
Inserção
● Caso 2
P
C
G
G
P
24 / 40
Inserção
● Caso 2
P
C
G
G
C P
24 / 40
Inserção
● Casos 3 e 4
25 / 40
Inserção
● Casos 3 e 4– O caso 3 é um espelho do caso 1.
25 / 40
Inserção
● Casos 3 e 4– O caso 3 é um espelho do caso 1.– O caso 4 é um espelho do caso 2.
25 / 40
Inserção
● Casos 3 e 4– O caso 3 é um espelho do caso 1.– O caso 4 é um espelho do caso 2.– A diferença é que o novo elemento é inserido na
subárvore à direita do nó pivot ou como um descendente da subárvore à direita.
25 / 40
Inserção
● Caso 3
26 / 40
Inserção
● Caso 3
26 / 40
Inserção
● Caso 3
26 / 40
Inserção
● Caso 4
27 / 40
Inserção
● Caso 4
27 / 40
Inserção
● Caso 4
27 / 40
Inserção
● Vamos construir uma AVL com os seguintes elementos: [60, 25, 35, 100, 17, 80]
28 / 40
Inserção
● Vamos construir uma AVL com os seguintes elementos: [60, 25, 35, 100, 17, 80]
60
28 / 40
Inserção
● Vamos construir uma AVL com os seguintes elementos: [60, 25, 35, 100, 17, 80]
60 60
25
28 / 40
Inserção
● Vamos construir uma AVL com os seguintes elementos: [60, 25, 35, 100, 17, 80]
60 60
25
60
25
35
DESBALANCEADA 28 / 40
Inserção
● Rotacionamento
29 / 40
Inserção
● Rotacionamento
60
25
35
29 / 40
Inserção
● Rotacionamento
60
25
35
PASSO 1
29 / 40
Inserção
● Rotacionamento
60
25
35
60
35
25
PASSO 1
29 / 40
Inserção
● Rotacionamento
60
25
35
60
35
25
PASSO 1 PASSO 2
29 / 40
Inserção
● Rotacionamento
60
25
35
60
35
25
35
25 60
PASSO 1 PASSO 2
29 / 40
Inserção
● Continuando a inserçao [..., 100, 17, 80]
30 / 40
Inserção
● Continuando a inserçao [..., 100, 17, 80]
35
25 60
100
30 / 40
Inserção
● Continuando a inserçao [..., 100, 17, 80]
35
25 60
100
35
25 60
10017
30 / 40
Inserção
● Continuando a inserção [..., 80]
31 / 40
Inserção
● Continuando a inserção [..., 80]
35
25 60
10017
8031 / 40
Inserção
● Continuando a inserção [..., 80]
DESBALANCEADA35
25 60
10017
8031 / 40
Inserção
● Rotacionamento
32 / 40
Inserção
● Rotacionamento
35
25 60
10017
8032 / 40
Inserção
● RotacionamentoPASSO 1
35
25 60
10017
8032 / 40
Inserção
● Rotacionamento
35
25 60
8017
100
PASSO 135
25 60
10017
8032 / 40
Inserção
● Rotacionamento
33 / 40
Inserção
● Rotacionamento
35
25 60
8017
10033 / 40
Inserção
● Rotacionamento
35
25 60
8017
100
PASSO 2
33 / 40
Inserção
● Rotacionamento
35
25 60
8017
100
35
25 80
10017 60
PASSO 2
33 / 40
Remoção
34 / 40
Remoção
● Quando um elemento é removido de uma AVL, nós devemos garantir que a propriedade de balanceamento seja mantida.
34 / 40
Remoção
● Quando um elemento é removido de uma AVL, nós devemos garantir que a propriedade de balanceamento seja mantida.
● Depois de remover o elemento desejado, as subárvores devem ser rebalanceadas.
34 / 40
Remoção
● Suponha que vamos remover o nó 17 da AVL abaixo:
35 / 40
Remoção
● Suponha que vamos remover o nó 17 da AVL abaixo:
35 / 40
Remoção
● Suponha que vamos remover o nó 17 da AVL abaixo:
35 / 40
Remoção
● Necessária uma rotação no nó pivot 25.
36 / 40
Remoção
● Quando uma subárvore é rebalanceada devido a uma remoção dos seus nós, pode ser que os pais desse nó (pivot) se tornem desbalanceados.
● Esse efeito colateral pode ir subindo na árvore.● Se isso ocorrer, esses nós deverão ser
avaliados e rebalanceados, se necessário.
37 / 40
Exercícios
● Considere o conjunto de valores abaixo e mostre a construção, de cada elemento, em uma árvore AVL. – Valores: [30, 63, 2, 89, 16, 24, 19, 52, 27, 9, 4, 45]
● A ordem em que os elementos são inseridos numa árvore AVL não importa, pois independente da ordem, sempre resulta na mesma árvore. O que você acha?
38 / 40
Exercícios
● Considere a árvore AVL abaixo e mostre o resultado dessa árvore após remover as chaves 1, 78 e 41.
39 / 40
Exercícios
● Qual é a diferença entre ABB e AVL?● Dada uma árvore binária T, proponha um
programa em Python que determine se T é uma árvore AVL (lembrando-se das restrições de altura e de árvore de busca).
● Quantas árvores AVL existem com altura 1, 2, 3 e 4? Faça o mesmo considerando um número mínimo de nós (dica: construa todas as possíveis árvores binárias que também sejam AVL).
40 / 40