Árvores AVLtiagodemelo.info/wp-content/uploads/2020/09/arvores-avl... · 2020. 9. 22. · O...

Post on 04-Dec-2020

0 views 0 download

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

tmelo@uea.edu.br

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

G

P

h S1 h-1S2

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