Estruturas de Dados 2020/2021 (CC1007) - DCC/FCUP

Aula Prática #12 - Árvores Binárias
(semana de 24/05 a 28/05)


Exercícios para submissão

Para efeitos da nota atribuída à resolução de exercícios ao longo do semestre, os exercícios que pode submeter desta aula são:

Prazo de submissão: 12 de Junho (submeter no Mooshak de EDados)

É encorajado que vão falando com os docentes e outros colegas se tiverem dificuldades. No entanto, qualquer ajuda mais direta que tenham recebido de outros colegas deve ser reconhecida nos comentário do programa que submetem.
Depois do prazo os problemas continuarão disponíveis no Mooshak, mas as submissões não contarão para a sua nota.
Cada aula vale 10% da nota desta componente. Como existem 12 aulas com submissões, pode ter pontuação máxima mesmo sem ter feito tudo.
Para um problema contar tem acertar todos os testes (ou seja, ter accepted). Mesmo que resolva todos os problemas, o máximo numa aula é de 100%.
Para ter 100% bastará sempre resolver os exercícios do guião principal.


Conteúdos das teóricas

Nesta aula iremos abordar conceitos de árvores binárias. Será por isso conveniente ver o que foi falado nas teóricas:


Exercício 1) Compreender Árvores Binárias

  1. Uma primeira árvore binária.
    Uma maneira de descrever uma árvore é usar uma das seguintes representações:

    Considere a árvore binária da figura seguinte:


    Nas 4 representações anteriores, a árvore da figura seria descrita do seguinte modo:

  2. Percebendo as várias ordens de visita aos nós Para garantir que percebeu, procure agora escrever no seu caderno as 4 representações como descritas para a seguinte árvore (preorder, inorder, postorder, em largura):



Exercício 2) Introdução à implementação de Árvores Binárias

  1. Código de Árvores Binárias.
    Faça download do código dado nas teóricas e compile-o:

    Espreite o ficheiro BTNode.java para ver como um nó é descrito por três atributos: value, left e right. Veja também no ficheiro BTree.java como o único atributo de uma árvore é a sua raíz (root)

  2. Um primeiro teste.
    Crie um ficheiro input.txt contendo a seguinte linha: 5 1 8 N N 6 N N 7 2 N N N. Esta é a representação preorder da árvore binária da figura seguinte (onde N representa explicitamente um nó nulo).


    (as duas representações da imagems referem-se à mesma árvore)

    Agora execute a classe de teste das árvores dando como input o ficheiro que criou:

    $ java TestBTree < input.txt

    Procure acompanhar cada uma das linhas de código de TestBTree.java e o seu efeito, usando os slides para cimentar o seu vocabulário de árvores. Espreite também Para os métodos numberNodes, depth e contains

  3. Um segundo teste.
    Crie um ficheiro input2.txt contendo a descrição preorder da árvore binária de 7 nós descrita na figura da pergunta 1.2. Execute novamente TestBTree, agora com este novo input, e verifique se os resultados são os esperados.

Exercício 3) Vários exercícios de árvores


  1. Contando o número de folhas.
    O método numberNodes conta o número de nós. Para garantir que percebeu como funciona, vamos agora fazer um exercício parecido.
    Resolva e submeta o problema [ED204] Contando folhas.

  2. Verificando se uma árvore é "estritamente binária".
    Resolva e submeta o problema [ED205] Árvores estritamente binárias.

  3. Caminhos numa árvore
    Resolva e submeta o problema [ED206] Percorrendo caminhos.

  4. Número de nós a uma dada profundidade
    Resolva e submeta o problema [ED207] Nós profundos.

Exercícios extra para consolidação de conhecimentos

Aqui ficam mais alguns problemas envolvendo árvores para resolver no Mooshak:


  1. [ED211] Contando os números pares

  2. [ED212] Soma de todos os níveis

  3. [ED213] Caminho de maior soma

Exercício de Desafio

O exercício de desafio desta semana envolve obviamente... árvores!

Não vou dizer mais para não tirar a piada a fazerem o problema, mas se precisarem de dicas, avisem-me.