Você está na página 1de 12

Lista de Exercícios - Árvores Binárias, AVL e Rubro-Negras

1. Realize as seguintes operações em uma árvore binária vazia inicialmente:


a) Inserir na ordem de chegada os elementos: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16
b) Remover na ordem de requisição os elementos: 9, 10, 11, 12, 1, 2, 3
c) Inserir os elementos, na ordem de chegada: 11, 17, 18, 19, 20, 1
d) Buscar os elementos: 1, 2, 3, 18, 19, 20

2. Realize as seguintes operações em uma árvore binária vazia inicialmente:


a) Inserir na ordem de chegada os elementos: 15, 14, 13, 1, 2, 3, 12, 11, 10, 4, 5, 6, 9,
8, 7, 16
b) Remover na ordem de requisição os elementos: 9, 10, 11, 12, 1, 2, 3
c) Inserir os elementos, na ordem de chegada: 11, 17, 18, 19, 20, 1
d) Buscar os elementos: 1, 2, 3, 18, 19, 20

3. Quantas árvores binárias de pesquisa (ABP) diferentes podem armazenar as chaves


{1, 2, 3, 4, 5, 6}?

4. Implemente, em C++, uma árvore binária de busca.

5. Uma árvore estritamente binária é uma árvore binária em que cada nó tem 0 ou 2 filhos.
Uma árvore binária cheia é uma árvore em que se um nó tem alguma sub-árvore vazia
então ele está no último nível. Uma árvore completa é aquela em se n é um nó com
algumas de subárvores vazias, então n se localiza no penúltimo ou no último nível.
Portanto, toda árvore cheia é completa e estritamente binária. A Figura a seguir mostra
uma árvore estritamente binária, completa e cheia.

Escreva um algoritmo para verifcar se uma árvore binária é estritamente binária, completa
ou cheia.
Obs: para alguns autores, os conceitos podem ser diferentes, sendo que o que chamamos
aí de árvore cheia (c) recebe o nome de completa e o que foi chamado de completa (b)
recebe o nome de quase-completa.

6. TAD - Árvore Binária de Busca com Contadores


Altere o código da árvore binária de busca para que a árvore permita elementos repetidos,
mas as repetições devem ser armazenadas no próprio nó. Ou seja, cada nó conterá, além
do valor, um contador para informar quantos elementos daquele valor estão armazenados.
Ao inserir um elemento na árvore, caso já exista um nó com esse valor, então o contador é
incrementado. O processo de remoção, por sua vez, irá decrementar o contador, só
removendo o nó quando o valor for totalmente excluído da árvore.

7. Implemente um método para calcular a altura de uma árvore binária de busca.

8. Implemente um método para calcular o número de nós de uma árvore binária.

9. Implemente um método para calcular o número de folhas de uma árvore binária.

10. Duas árvores binárias são similares se elas são vazias ou se elas não são vazias e suas
subarvores da esquerda são similares e suas subarvores da direita são também similares.
Escreva um algoritmo para determinar se duas árvores binárias são similares.

11. Árvores Binárias de Expressões.


Considere árvores binárias que representam expressões aritméticas (composta por
operandos compostos por um único algarismo, operações de +, -, * e / e parênteses) como
as apresentadas a seguir:

Nesse caso a primeira árvore representa 3 + (5*8) e a segunda representa (3+5)*8


Implemente um método para receber uma expressão matemática (composta por operandos
compostos por um único algarismo, operações de +, -, * e / e parênteses) e retorne uma
árvore binária representando esta expressão. Construa também um método que, dada uma
árvore binária que represente uma expressão matemática, apresente (imprima) a versão
infixa da expressão.
12. TAD - Trie - Árvore PATRICIA
Em ciência da computação, uma trie, ou árvore de prefixos, é uma estrutura de dados do
tipo árvore ordenada, que pode ser usada para armazenar um array associativo em que as
chaves são normalmente cadeias de caracteres (strings). Diferente de uma árvore binária
de busca, nenhum nó armazena a chave associada a ele. Ao invés disso, a posição do nó
na árvore é que define a chave. Todos os descendentes de um nó tem um prefixo comum
da string associada ao nó e a raiz é associada com a string vazia. Veja figura a seguir com
as palavras “tree”, “trie”, “algo”, “assoc”, “all” e “also”.

Veja figura a seguir com uma trie para as palavras to, tea, ted, ten, A e inn (desconsidere os
números):

Em geral, uma trie possui um grupo disperso de chaves, desse modo, muitos nós possuem
apenas um descendente. Isto faz com que as tries tenham um custo grande de espaço. A
árvore PATRICIA, que é uma árvore de prefixos binária, é uma representação compacta de
uma trie onde os nós que teriam apenas um filho são agrupados nos seus antecessores.
Veja exemplo a seguir:

Seu objetivo é Implementar uma árvore PATRÍCIA genérica, com operações de inserção e
remoção disponíveis.
13 - Árvore de Palavras (Resolução por Árvore Binária)

Considere um arquivo texto preenchido. Esse arquivo deve ser o parâmetro de entrada para
o seu sistema que deve:
● armazenar cada palavra do texto em um nó de uma árvore binária de busca;
● armazenar, para cada palavra, a posição em que ela aparece no texto, por exemplo:
Neste exemplo a palavra e aparece nas posições 1, 16 e 19, ou seja, ela aparece mais de
uma vez no texto, mas deve ser representada por apenas um nó na árvore. As posições das
repetições devem ser armazenadas no mesmo nó.

Considere que as palavras serão escritas sem acentos e que, antes de serem
armazenadas, devem ser convertidas para caracteres minúsculos apenas. Desconsidere
caracteres de pontução.

Seu programa deve, ainda, permitir a busca por uma determinada palavra. Caso a palavra
esteja presente na árvore, o programa deverá imprimir a palavra buscada e as posições em
que se encontra. Caso a palavra não seja encontrada, o programa deve mostrar uma
mensagem avisando a ocorrência.

Não é necessária e desejável a criação de um método para a remoção de palavras da


árvore.

14. Codificação de Huffman.


Em redação…
15. Redes Sociais (com Árvores Binárias)
Considere uma rede social em que, para cada usuário, são armazenadas as seguintes
informações:
● nome;
● identificador (número inteiro);
● amizades.

As amizades são armazenadas através do identificador das pessoas com as quais uma
determinada pessoa tem amizade. As pessoas serão armazenadas em uma árvore binária
de busca utilizando o seu identificador como chave e, para cada pessoa, será armazenada
uma árvore binária de busca com os identificadores das pessoas amigas.

Implemente, usando como base árvores binárias de busca, um sistema que permita:
● a inserção de novos usuários na rede social;
● a remoção de usuários da rede social;
● inclusão de novos amigos para uma determinada pessoa;
● a consulta de amizade entre duas pessoas;
● encontrar o caminho de amizade entre duas pessoas.

Caminho de amizade: este método deve receber o identificador de duas pessoas que já
estão no sistema, verificar se elas possuem relação de amizade e, em caso negativo, deve
mostrar um possível caminho de amizade entre as duas. Por exemplo, considere o exemplo
abaixo com os usuários da rede social:

Suponha que nessa rede social, as amizades de Kal-El são as seguintes:


Suponha também que as amizades de Bruce Wayne são:

Considere, ainda, que as amizades de Harleen Quinzel são:

Dessa forma, pode ser estabelecido um caminho de amizade entre Kal-el e Poison Ivy:
16 - Torres de Hanoi (Resolução por Árvore Binária) - Adaptado de [Langsam,
Augenstein & Tenenbaum, 1996]
O problema das Torres de Hanoi pode ser descrito como: existem 3 torres, A, B e C, com n
discos de diferentes diâmetros são empilhados em A. Um disco de diâmetro maior é sempre
colocado abaixo de um disco de diâmetro menor. O objetivo é mover os n discos para a
torre C, usando a torre B como auxiliar. Apenas o disco no topo de uma torre pode ser
movido para outra torre, e um disco de diâmetro maior nunca pode ser colocado sobre um
disco de diâmetro menor. A solução para o problema das Torres de Hanoi com n discos
pode ser representado por uma árvore binária completa de nível n – 1, como descrito a
seguir:
a) Seja a raiz da árvore a representação do movimento de um disco do topo de uma torre
qualquer para outra torre qualquer.
b) Seja um nó N uma representação do movimento da torre X (origem) para a torre Y
(destino), e seja Z a terceira torre, que não é a origem nem o destino do disco em
movimento. Então esquerda(N) representa o movimento de X para Z e direita(N) representa
o movimento de Z para Y. O percurso in-order da árvore resultante produz a solução para o
problema das Torres de Hanoi com n discos. Veja a ilustração a seguir.
Implemente um método que aceite a quantidade de discos N, gere e percorra a árvore como
apresentado anteriormente.
17. Realize as seguintes operações em uma AVL vazia inicialmente:
a) Inserir na ordem de chegada os elementos: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16
b) Remover na ordem de requisição os elementos: 9, 10, 11, 12, 1, 2, 3
c) Inserir os elementos, na ordem de chegada: 11, 17, 18, 19, 20, 1
d) Buscar os elementos: 1, 2, 3, 18, 19, 20

18. Realize as seguintes operações em uma AVL vazia inicialmente:


a) Inserir na ordem de chegada os elementos: 15, 14, 13, 1, 2, 3, 12, 11, 10, 4, 5, 6, 9,
8, 7, 16
b) Remover na ordem de requisição os elementos: 9, 10, 11, 12, 1, 2, 3
c) Inserir os elementos, na ordem de chegada: 11, 17, 18, 19, 20, 1
d) Buscar os elementos: 1, 2, 3, 18, 19, 20

19. Realize as seguintes operações em uma árvore rubro-negra vazia inicialmente:


a) Inserir na ordem de chegada os elementos: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16
b) Remover na ordem de requisição os elementos: 9, 10, 11, 12, 1, 2, 3
c) Inserir os elementos, na ordem de chegada: 11, 17, 18, 19, 20, 1
d) Buscar os elementos: 1, 2, 3, 18, 19, 20

20. Realize as seguintes operações em uma árvore rubro-negra vazia inicialmente:


a) Inserir na ordem de chegada os elementos: 15, 14, 13, 1, 2, 3, 12, 11, 10, 4, 5, 6, 9,
8, 7, 16
b) Remover na ordem de requisição os elementos: 9, 10, 11, 12, 1, 2, 3
c) Inserir os elementos, na ordem de chegada: 11, 17, 18, 19, 20, 1
d) Buscar os elementos: 1, 2, 3, 18, 19, 20

21. Insira em uma árvore AVL, itens com as chaves apresentadas nos itens a seguir (na
ordem
em que aparecem). Desenhe a árvore resultante da inserção, sendo que uma nova árvore
deve ser desenhada quando houver uma rotação. Indique qual a rotação que foi executada.
a) 30, 40, 24, 58, 48, 26, 11, 13, 14
b) 20, 15, 25, 10, 30, 24, 17, 12, 5, 3
c) 40, 30, 50, 45, 55, 52
d) 20, 15, 25, 12, 17, 24, 30, 10, 14, 13
e) 20, 15, 25, 12, 17, 30, 26

22. Mostre as árvores Rubro-Negras que resultam após a inserção bem-sucedida das
chaves 41, 38, 31, 12, 18, 8 em uma árvore Rubro-Negra inicialmente vazia. Em
seguida, mostre as árvores Rubro-Negras que resultam da eliminação sucessiva das
chaves na seguinte ordem: 8, 12, 18, 31, 38, 41.

23. Prove com contra-exemplo.


a) toda árvore AVL é uma árvore Rubro-Negra.
b) toda árvore Rubro-Negra é uma árvore AVL.

24. Insira em uma árvore Rubro-Negra, itens com as chaves: 4 – 7 – 12 – 15 – 3 – 5 – 14 –


18 (nesta ordem). Desenhe a árvore resultante da inserção, sendo que uma nova
árvore deve ser desenhada quando houver uma rotação ou troca de cores. (Atenção:
verifique a necessidade de rotação e/ou troca de cores a cada inserção)

25. Monte a árvore AVL (passo-a-passo) para as seguintes inserções de chaves,


indicando a cada passo qual elemento foi inserido ou qual rotação foi realizada:
a) 50, 30, 20, 70, 40, 35, 37, 38, 10, 32, 45, 42, 25, 47, 36.
b) 100, 80, 60, 40, 20, 70, 30, 50, 35, 45, 55, 75, 65, 73, 77

26. Monte a árvore rubro-negra (passo-a-passo) para as seguintes inserções de chaves,


indicando a cada passo qual elemento foi inserido ou qual rotação foi realizada:
a) 50, 30, 20, 70, 40, 35, 37, 38, 10, 32, 45, 42, 25, 47, 36.
b) 100, 80, 60, 40, 20, 70, 30, 50, 35, 45, 55, 75, 65, 73, 77

27. Implemente, em C++, uma árvore AVL.

28. Implemente, em C++, uma árvore rubro-negra.

Você também pode gostar