Lista de exercícios
Aula prática 08: árvores, relações e representações
20 exercícios sobre hierarquia, medidas, representações, armazenamento e aplicações de árvores, com soluções comentadas e diagramas Mermaid.
Resolva cada exercício e use a seção Resposta esperada como modelo para comparação e autocorreção. Para os desenhos, use papel ou a ferramenta que preferir. O tempo estimado inclui a tentativa e a conferência das soluções.
Convenção da aula: a raiz está no nível 1. A altura/profundidade da árvore, no sentido usado pelos slides, é seu maior nível. A profundidade de um nó, quando solicitada, contará arestas desde a raiz. Essas medidas serão distinguidas explicitamente. Nesta lista, um nó não é ancestral nem descendente de si mesmo, mas pertence à própria subárvore. Nos diagramas de hierarquia, cada seta indica pai → filho.
Exercício 1: nós, dados e arestas
Explique a diferença entre um nó, o dado armazenado nele e uma aresta. Dois nós podem armazenar o mesmo dado e continuar sendo nós distintos? Justifique.
Solução
Explicação
Um nó, também chamado nodo ou vértice, é um elemento da árvore que armazena dados. Uma aresta conecta dois nós e, nesta hierarquia, representa uma relação pai-filho. O conteúdo armazenado não determina a identidade do nó: elementos distintos podem conter o mesmo dado.
Objetivo de aprendizagem: distinguir os elementos da árvore, seus conteúdos e suas conexões, sem confundir igualdade de dados com identidade dos nós.
Resposta esperada
Nó: elemento da árvore. Dado: conteúdo armazenado no nó. Aresta: conexão entre dois nós. Sim, dois nós podem armazenar dados iguais, pois a igualdade do conteúdo não transforma elementos distintos em um único nó.
Exercício 2: reconstruir a hierarquia pelos parentescos
Desenhe uma árvore usando exatamente os nós R, A, B, C, D, E, F e G, uma vez cada. Marque as folhas nos rótulos. A raiz não possui pai, e uma folha não possui filhos. Irmãos compartilham o mesmo pai. Avô é o pai do pai.
Use somente estas relações:
- R é a raiz e seus únicos filhos são A, B e C.
- D é filho de A, e E é irmão de D.
- G é filho de F, e B é avô de G.
Não acrescente outras arestas. A ordem entre irmãos não importa. Liste também os ancestrais de G, isto é, os nós encontrados ao subir pelos pais, sem incluir G.
Solução
Explicação
E precisa ter o mesmo pai de D, portanto também é filho de A. Como F é pai de G e B é avô de G, B precisa ser pai de F. As relações determinam as sete ligações e conectam todos os oito nós à raiz R. Subir de G percorre F, B e R.
Objetivo de aprendizagem: reconstruir uma hierarquia por parentescos diretos e indiretos, identificando raiz, folhas e ancestrais.
Resposta esperada
flowchart TD
r["R"] --> a["A"]
r --> b["B"]
r --> c["C: folha"]
a --> d["D: folha"]
a --> e["E: folha"]
b --> f["F"]
f --> g["G: folha"]
Folhas: C, D, E e G. Ancestrais de G, do mais próximo ao mais distante: F, B e R. Todos os nós diferentes de R possuem um único pai, e nenhuma ligação forma ciclo.
Exercício 3: grau do nó e grau da árvore
Calcule os graus desta árvore. O grau de um nó é sua quantidade de filhos. O grau da árvore é o maior grau entre seus nós. Uma árvore n-ária admite no máximo filhos por nó, inclusive zero.
flowchart TD
p["P"] --> q["Q"]
p --> r["R"]
q --> s["S"]
q --> t["T"]
q --> u["U"]
Informe o grau de cada nó, o grau da árvore e se ela respeita os limites de uma árvore ternária, na qual , e de uma árvore binária, na qual .
Solução
Explicação
Contamos somente os filhos, sem somar a ligação com o pai. Q tem três filhos e estabelece o maior grau. O limite ternário não exige que todos os nós tenham três filhos. Já o limite binário seria ultrapassado por Q.
Objetivo de aprendizagem: medir a ramificação de nós e da árvore para verificar um limite de filhos por nó.
Resposta esperada
Graus: P = 2, Q = 3, R = 0, S = 0, T = 0 e U = 0. Grau da árvore: 3. Ela respeita o limite ternário porque nenhum nó possui mais de três filhos. Não respeita o limite binário, pois Q possui três filhos.
Exercício 4: corrigir uma hierarquia inválida
Corrija as ligações abaixo para obter uma árvore com raiz R, preservando os quatro nós. Em uma árvore com raiz, a raiz não possui pai, cada outro nó possui exatamente um pai, todos são alcançáveis a partir da raiz e não existem ciclos, isto é, caminhos fechados.
flowchart TD
r["R"] --> p["P"]
r --> q["Q"]
p --> s["S"]
q --> s
s --> r
Indique quais regras a proposta viola e quais duas arestas você removeria. Não acrescente arestas nem remova nós.
Solução
Explicação
R recebe uma ligação de S, embora seja a raiz proposta. S recebe ligações de P e Q, portanto possui dois pais. Há ciclos como R → P → S → R. Remover S → R elimina o retorno à raiz, mas ainda precisamos retirar uma das duas ligações que chegam a S.
Objetivo de aprendizagem: corrigir uma hierarquia verificando conjuntamente ausência de ciclos, raiz sem pai, pai único e conexão de todos os nós.
Resposta esperada
Violações: R tem pai, S tem dois pais e existem caminhos fechados, como R → P → S → R.
Uma correção: remover S → R e Q → S. Restam R → P, R → Q e P → S. R fica sem pai, os outros nós têm um pai cada, todos são alcançáveis a partir de R e não há ciclos. Também é válida a remoção de S → R e P → S.
Exercício 5: caminho e comprimento
Escreva o caminho de A até G seguindo as setas. Um caminho é uma sequência de nós consecutivamente ligados. Seu comprimento será contado em arestas, não em nós. Nesta lista, um ramo completo é um caminho da raiz até uma folha.
flowchart TD
a["A"] --> b["B"]
a --> c["C"]
b --> d["D"]
c --> e["E"]
e --> g["G"]
Informe a sequência, seu comprimento e se esse caminho é um ramo completo, justificando a classificação.
Solução
Explicação
Para chegar a G, precisamos passar por seu pai E, cujo pai é C. Há quatro nós na sequência correta, mas apenas três ligações. O caminho começa na raiz A e termina em G, que não possui filhos.
Objetivo de aprendizagem: reconstruir um caminho, medir seu comprimento em arestas e reconhecer um ramo completo pelos seus extremos.
Resposta esperada
Caminho: A → C → E → G. Comprimento: 3 arestas. É um ramo completo, pois começa na raiz A e termina na folha G.
Exercício 6: extrair uma subárvore inteira
Desenhe a subárvore com raiz C, preservando seus nós e suas ligações. Uma subárvore com raiz em um nó contém esse nó e todos os seus descendentes.
flowchart TD
a["A"] --> b["B"]
a --> c["C"]
c --> d["D"]
c --> e["E"]
d --> f["F"]
e --> g["G"]
Indique também quais nós da árvore original ficam fora da subárvore solicitada.
Solução
Explicação
Partir de C e acompanhar todos os filhos inclui D, E, F e G. A está acima de C e B pertence a outro ramo. Nenhum dos dois é descendente de C.
Objetivo de aprendizagem: extrair uma subárvore sem remover descendentes obrigatórios nem incluir ancestrais ou ramos externos.
Resposta esperada
flowchart TD
c["C"] --> d["D"]
c --> e["E"]
d --> f["F"]
e --> g["G"]
A subárvore contém C, D, E, F e G. Ficam fora A e B.
Exercício 7: nível, altura da árvore e profundidade do nó
Calcule as posições dos nós. Use raiz no nível 1. A altura da árvore, conforme a aula, é o maior nível. A profundidade de um nó é a quantidade de arestas desde a raiz, portanto a raiz tem profundidade 0.
A altura de um nó em arestas é o comprimento do maior caminho desse nó até uma folha. Uma folha tem altura 0 nessa medida.
flowchart TD
k["K"] --> l["L"]
k --> m["M"]
l --> n["N"]
m --> o["O"]
o --> p["P"]
Informe o nível de cada nó, a altura da árvore segundo a aula e as duas medidas em arestas: altura de L e profundidade de P.
Solução
Explicação
Cada descida acrescenta um nível e uma aresta percorrida. P está três arestas abaixo de K e ocupa o nível 4, porque a contagem de níveis começou em 1. A altura de L conta no sentido oposto: de L até sua folha mais distante, N, há uma aresta.
Objetivo de aprendizagem: distinguir nível, altura e profundidade pelo ponto de referência, pelo sentido do caminho e pela unidade de contagem.
Resposta esperada
Níveis: K = 1, L = 2, M = 2, N = 3, O = 3 e P = 4. Altura da árvore pela aula: 4 níveis. Altura de L: 1 aresta. Profundidade de P: 3 arestas.
Exercício 8: uma árvore pode originar uma floresta
Desenhe o resultado de remover somente R e todas as arestas que saem de R. Preserve todos os outros nós e ligações. Uma floresta é um conjunto de árvores separadas. Uma árvore com um único nó também pode ser um componente da floresta.
flowchart TD
r["R"] --> a["A"]
r --> b["B"]
r --> c["C"]
a --> d["D"]
b --> e["E"]
e --> f["F"]
Informe quantas árvores permanecem e suas raízes.
Solução
Explicação
Cada filho direto de R inicia uma árvore independente quando a ligação com R desaparece. Remover R não remove os descendentes dos filhos. C permanece como árvore de um único nó.
Objetivo de aprendizagem: reconhecer os componentes de uma floresta e separar remoção de um nó de remoção de sua subárvore inteira.
Resposta esperada
flowchart TD
a["A"] --> d["D"]
b["B"] --> e["E"]
e --> f["F"]
c["C"]
Permanecem 3 árvores, com raízes A, B e C.
Exercício 9: ordem dos filhos e hierarquia
Compare as duas representações. Os números nas arestas indicam a posição de cada filho. A aula chama de ordenada a árvore em que a ordem dos filhos importa e de orientada aquela em que somente a hierarquia importa. Use esses sentidos nesta questão.
Representação X:
flowchart TD
r["R"] -->|1| p["P"]
r -->|2| q["Q"]
q --> s["S"]
Representação Y:
flowchart TD
r["R"] -->|1| q["Q"]
r -->|2| p["P"]
q --> s["S"]
Indique se representam a mesma árvore sob cada um dos dois sentidos e justifique a diferença.
Solução
Explicação
R continua sendo pai de P e Q, e Q continua sendo pai de S. A mudança está somente nas posições de P e Q. O termo orientada está sendo usado conforme a aula, para comparação sem ordem dos irmãos. Ele não serve aqui para classificar a presença de setas no desenho.
Objetivo de aprendizagem: separar ordem de apresentação e relação pai-filho ao comparar duas árvores.
Resposta esperada
- Como árvores ordenadas: são diferentes, porque X tem filhos de R na ordem P, Q e Y na ordem Q, P.
- Como árvores orientadas no sentido da aula: são iguais, porque todas as relações pai-filho foram preservadas.
Exercício 10: interpretar o aninhamento
Desenhe a árvore descrita por (H(J(L))(K(M)(N))). No aninhamento, cada par de parênteses contém um nó seguido de seus filhos, que aparecem em outros pares de parênteses. Por exemplo, (X(Y)) representa X com um único filho Y.
Preserve a ordem textual dos filhos e indique essa ordem nas arestas.
Solução
Explicação
Dentro do par externo está H. Seus dois grupos imediatos começam em J e K. L pertence ao grupo de J, enquanto M e N pertencem ao grupo de K. Estar dentro do grupo de H não torna todos esses nós filhos diretos de H.
Objetivo de aprendizagem: recuperar parentescos diretos a partir de grupos aninhados, distinguindo filhos de descendentes mais distantes.
Resposta esperada
flowchart TD
h["H"] -->|1| j["J"]
h -->|2| k["K"]
j -->|1| l["L"]
k -->|1| m["M"]
k -->|2| n["N"]
Exercício 11: construir a matriz de adjacência
Monte a matriz de adjacência da árvore abaixo, usando a ordem R, A, B, C, D nas linhas e colunas. Nesta representação da aula, a linha indica o pai e a coluna indica o filho. Registre 1 somente para uma ligação direta pai → filho e 0 nos demais casos.
flowchart TD
r["R"] --> a["A"]
r --> b["B"]
a --> c["C"]
b --> d["D"]
Solução
Explicação
R possui dois filhos diretos, então sua linha tem dois valores 1. C é descendente de R, mas não seu filho: a célula da linha R e coluna C recebe 0. Não espelhamos os valores para representar filho → pai, pois a convenção desta matriz é direcional.
Objetivo de aprendizagem: codificar somente a adjacência direta, preservando o sentido pai-filho e a ordem dos índices.
Resposta esperada
As linhas identificam os pais e as colunas identificam os filhos.
| Pai / Filho | R | A | B | C | D |
|---|---|---|---|---|---|
| R | 0 | 1 | 1 | 0 | 0 |
| A | 0 | 0 | 0 | 1 | 0 |
| B | 0 | 0 | 0 | 0 | 1 |
| C | 0 | 0 | 0 | 0 | 0 |
| D | 0 | 0 | 0 | 0 | 0 |
Exercício 12: espaço reservado na matriz
Analise o espaço reservado pela matriz de adjacência abaixo. Ela representa uma árvore com seis nós. Cada linha identifica um pai e cada coluna, um filho. O valor 1 registra uma ligação direta pai → filho, e 0 indica ausência dessa ligação. Considere 1 byte por célula.
| Pai / Filho | R | A | B | C | D | E |
|---|---|---|---|---|---|---|
| R | 0 | 1 | 1 | 0 | 0 | 0 |
| A | 0 | 0 | 0 | 1 | 1 | 0 |
| B | 0 | 0 | 0 | 0 | 0 | 1 |
| C | 0 | 0 | 0 | 0 | 0 | 0 |
| D | 0 | 0 | 0 | 0 | 0 | 0 |
| E | 0 | 0 | 0 | 0 | 0 | 0 |
- Quantas células e quantos bytes a matriz reserva ao todo?
- Quantas células contêm 0 e quantos bytes elas ocupam? Esses bytes estão realmente livres? Justifique.
- Proponha como armazenar os filhos sem uma matriz quadrada. Compare dois casos: um limite de filhos por nó grande, com poucos filhos na maioria dos nós, e um limite pequeno e fixo, como 2 ou 3. Justifique qual estrutura usaria em cada caso. Não é necessário escrever código.
Solução
Explicação
A matriz possui células. Como cada célula ocupa 1 byte, ela reserva 36 bytes. Há dois valores 1 na linha de R, dois na de A e um na de B. Assim, cinco células registram ligações e as outras contêm 0.
Esses 31 bytes também estão ocupados pela matriz. O valor 0 informa que não existe aquela ligação, mas não libera a memória da célula. Para uma árvore não vazia com nós, a matriz reserva células, mas existem somente ligações pai-filho: cada nó, exceto a raiz, possui exatamente um pai. Por isso, a proporção de células sem ligação aumenta com o total de nós.
O limite de filhos permitido por nó, , não é o total de nós, . Uma árvore binária tem e pode ter milhares de nós. A escolha da representação precisa distinguir essas duas quantidades.
Quando é grande: uma lista encadeada de filhos por nó evita reservar muitas posições vazias. Cada elemento referencia um filho existente e o próximo elemento. Folhas têm listas vazias. No conjunto, há referências de início de lista e elementos para as ligações. O armazenamento cresce proporcionalmente ao total de nós, enquanto a matriz cresce com seu quadrado. Essa é a vantagem para árvores grandes, mesmo considerando as referências de encadeamento.
Quando é pequeno e fixo: um vetor de índices de filhos por nó pode ser mais adequado. Ele reserva posições, não , e dispensa a referência ao próximo elemento que cada célula de lista precisaria guardar. Ainda há posições vazias, mas sua quantidade por nó fica limitada ao pequeno valor de . Essa é a alternativa trabalhada no exercício 13. A comparação exata em bytes depende do tamanho dos campos de cada representação.
Objetivo de aprendizagem: quantificar o espaço reservado e perceber por que uma matriz pode conter muitas posições sem ligação registrada.
Resposta esperada
- 36 células e 36 bytes, pois .
- 31 células com 0, ocupando 31 bytes. Esses bytes não estão livres: continuam reservados para registrar a ausência de ligações na matriz.
- Limite grande: listas encadeadas de filhos guardam somente os filhos existentes, evitando reservar muitas posições vazias por nó. Limite pequeno e fixo: um vetor de índices por nó reserva poucas posições e dispensa as referências de encadeamento. A matriz reserva células. As listas usam referências de início e elementos, e os vetores reservam posições. Aqui, é o total de nós e é o limite de filhos por nó.
Exercício 13: armazenar somente os índices dos filhos
Preencha a tabela de filhos da árvore. Cada linha representa um nó e possui três posições para índices de filhos, na ordem indicada pelas arestas. Use −1 para uma posição vazia. O índice 0 é válido, por isso não pode representar ausência nessa tabela.
Os índices são 0 = L, 1 = M, 2 = N, 3 = O, 4 = P e 5 = Q.
flowchart TD
l["L"] -->|1| m["M"]
l -->|2| n["N"]
l -->|3| o["O"]
m --> p["P"]
n --> q["Q"]
Filhos únicos ocupam a primeira posição. Essa tabela contém índices, por isso não é a matriz quadrada de valores 0 e 1 do exercício de adjacência.
Solução
Explicação
A linha de L armazena os índices de M, N e O. M e N usam uma posição cada, e as folhas não usam nenhuma. O valor −1 distingue posição livre de uma referência válida ao nó de índice 0.
Objetivo de aprendizagem: representar filhos por índices e preencher posições livres sem confundir índice com marca de adjacência.
Resposta esperada
Cada linha informa o nó e as três posições reservadas para filhos.
| Nó: índice | Posição 1 | Posição 2 | Posição 3 |
|---|---|---|---|
| L: 0 | 1 | 2 | 3 |
| M: 1 | 4 | −1 | −1 |
| N: 2 | 5 | −1 | −1 |
| O: 3 | −1 | −1 | −1 |
| P: 4 | −1 | −1 | −1 |
| Q: 5 | −1 | −1 | −1 |
Exercício 14: capacidade de filhos não é capacidade de nós
Decida se a alteração cabe nesta representação. A coleção tem espaço para dez nós, mas cada linha da tabela de filhos possui somente duas posições. Atualmente, E tem os filhos F e G.
flowchart TD
e["E"] --> f["F"]
e --> g["G"]
É solicitado adicionar H como terceiro filho direto de E, preservando F e G. Há espaço para o novo nó na coleção. A tabela atual consegue representar essa relação? Justifique e informe a menor quantidade de posições por linha que permitiria a alteração.
Solução
Explicação
O lugar disponível para H resolve o armazenamento do registro, mas não cria uma terceira posição na linha de E. Colocar H na linha de F mudaria seu pai e não atenderia ao pedido. O limite de filhos precisa acompanhar o maior grau permitido.
Objetivo de aprendizagem: distinguir capacidade total de nós de capacidade local de filhos para diagnosticar uma limitação da representação.
Resposta esperada
Não cabe na tabela atual. E passaria a ter grau 3, mas sua linha comporta apenas dois filhos. São necessárias pelo menos 3 posições por linha nessa representação uniforme.
Exercício 15: mover uma subárvore e atualizar os ponteiros
Atualize os ponteiros para mover a subárvore de D de B para C. Cada nó armazena child_1 e child_2, referências diretas aos filhos, e parent, referência ao pai. Os filhos ocupam os campos na ordem das arestas. Um filho único ocupa child_1. Campos sem referência recebem NULL, que indica ausência e não representa um nó adicional.
Inicialmente, os ponteiros correspondem ao desenho. A referência externa root aponta para A, e a raiz tem parent = NULL. Uma árvore vazia teria root = NULL.
flowchart TD
a["A"] --> b["B"]
a --> c["C"]
b --> d["D"]
d --> e["E"]
Desenhe a hierarquia resultante e indique quais campos de B, C e D precisam mudar, com seus novos valores. D deve continuar sendo pai de E.
Solução
Explicação
A subárvore movida contém D e E. B precisa deixar de apontar para D, C precisa passar a apontar para D e o pai registrado em D precisa mudar. O campo liberado em B recebe NULL. Alterar somente os filhos deixaria parent de D inconsistente. As referências de pai são dados auxiliares: não acrescentam novas relações de filho à hierarquia.
Objetivo de aprendizagem: representar uma mudança de hierarquia com ponteiros diretos, mantendo coerência entre pai, filhos e referências nulas.
Resposta esperada
flowchart TD
a["A"] --> b["B"]
a --> c["C"]
c --> d["D"]
d --> e["E"]
- B:
child_1passa de D paraNULL. - C:
child_1passa deNULLpara D. - D:
parentpassa de B para C.
root continua apontando para A. child_1 de D continua apontando para E, e parent de E continua apontando para D. Os demais campos permanecem iguais.
Exercício 16: coleção de nós e listas de filhos
Compare as duas representações da mesma árvore. Na representação A, cada seta indica pai → filho. Na representação B, a coleção principal guarda os registros na ordem U, V, W, X, Y, e cada registro aponta para o início de sua própria lista encadeada de filhos.
Representação A: hierarquia da árvore.
flowchart TD
u["U"] -->|1| v["V"]
u -->|2| w["W"]
v --> x["X"]
w --> y["Y"]
Representação B: coleção de registros e listas de filhos.
Os retângulos mostram a posição e o nome de cada nó na coleção principal. As caixas arredondadas são elementos das listas e guardam referências aos nós indicados. NULL marca o fim de uma lista ou uma lista vazia.
flowchart LR
subgraph records["Coleção principal"]
u_record["0: U"]
v_record["1: V"]
w_record["2: W"]
x_record["3: X"]
y_record["4: Y"]
end
u_record -->|início| u_first_child(["referência a V"])
u_first_child -->|próximo| u_second_child(["referência a W"])
u_second_child -->|próximo| u_null(("NULL"))
v_record -->|início| v_child(["referência a X"])
v_child -->|próximo| v_null(("NULL"))
w_record -->|início| w_child(["referência a Y"])
w_child -->|próximo| w_null(("NULL"))
x_record -->|início| x_null(("NULL"))
y_record -->|início| y_null(("NULL"))
- Na lista de U, a seta próximo entre as referências a V e W torna V pai de W? Explique o que essa seta conecta.
- Se a coleção principal fosse reorganizada na ordem W, U, Y, V, X, mantendo todas as referências aos mesmos nós, a hierarquia mudaria? Justifique.
- Por que X e Y apontam diretamente para
NULLna representação B, embora apareçam na coleção principal?
Solução
Explicação
A representação A mostra os parentescos. A representação B mostra os registros e as listas que codificam esses parentescos. Na lista de U, a seta próximo encadeia dois elementos: um referencia V e outro referencia W. Essa ligação organiza a lista, enquanto a presença das duas referências na lista de U indica que V e W são filhos de U.
Mudar a ordem dos registros, preservando as referências aos mesmos nós, não altera nenhum parentesco. X e Y continuam registrados, mas suas listas de filhos estão vazias. Por isso, suas referências de início recebem NULL.
Objetivo de aprendizagem: separar a organização dos registros da organização hierárquica codificada pelas listas de filhos.
Resposta esperada
- Não. A seta próximo conecta elementos da lista de filhos de U. V e W são filhos de U, como mostra a representação A.
- Não. A ordem dos registros não determina os parentescos. Mantidas as referências aos mesmos nós, U continua sendo pai de V e W, V de X e W de Y.
- X e Y são folhas. Seus registros existem na coleção principal, mas suas listas de filhos estão vazias.
NULLindica ausência de filhos, não ausência desses nós na árvore.
Exercício 17: comparar o espaço das referências
Compare duas representações desta árvore, contando somente os campos de referência definidos abaixo. Em ambas, a coleção dos seis nós é um vetor. Ignore dados, referências ao pai, referência externa à raiz e custos do alocador.
flowchart TD
r["R"] --> a["A"]
r --> b["B"]
r --> c["C"]
a --> d["D"]
d --> e["E"]
- Modelo X: cada nó reserva três referências diretas para filhos, inclusive posições nulas.
- Modelo Y: cada nó reserva uma referência ao início da lista de filhos. Cada relação pai-filho usa uma célula com duas referências: uma ao filho e outra à próxima célula, inclusive a última referência nula.
Informe o total de campos de referência de cada modelo e se contar somente relações pai-filho bastaria para medir o armazenamento das listas.
Solução
Explicação
X reserva campos, dos quais cinco referenciam filhos e treze são nulos. Y reserva seis inícios de lista e cinco células com dois campos cada: . A lista evita posições fixas para filhos inexistentes, mas também precisa guardar seu próprio encadeamento.
Objetivo de aprendizagem: comparar armazenamento pelo modelo completo de referências, incluindo o custo necessário para organizar listas de filhos.
Resposta esperada
X: 18 campos de referência. Y: 16 campos de referência. Contar apenas as cinco relações pai-filho não basta para medir Y: também há seis referências de início e cinco de próxima célula. Neste modelo simplificado, Y usa dois campos a menos. Isso não prova economia em toda implementação, pois o custo do alocador e outros dados foram excluídos.
Exercício 18: reconhecer a finalidade da aplicação
Classifique cada uso pela finalidade principal descrita: organização hierárquica, busca ou representação de expressão para análise sintática. Não é preciso escolher um algoritmo de busca.
A tabela apresenta situações e o que o sistema precisa representar ou encontrar.
| Situação | Necessidade |
|---|---|
| Pastas de um sistema operacional | Registrar qual pasta contém cada subpasta |
| Árvore de pesquisa em inteligência artificial | Representar alternativas de estados para encontrar uma solução |
| Compilador | Representar operadores e operandos de uma expressão |
Solução
Explicação
Nas pastas, as relações descrevem contenção. Na pesquisa em inteligência artificial, representam alternativas para procurar um resultado. No compilador, descrevem a estrutura da expressão. Uma árvore pode apoiar mais de uma finalidade, mas a questão pede a finalidade principal de cada descrição.
Objetivo de aprendizagem: relacionar os modelos de árvore às aplicações citadas sem atribuir propriedades ou algoritmos que a aula não ensinou.
Resposta esperada
- Pastas de um sistema operacional: organização hierárquica.
- Árvore de pesquisa em inteligência artificial: busca.
- Compilador: representação de expressão para análise sintática.
Exercício 19: desenhar uma expressão aritmética
Desenhe a árvore da expressão abaixo. Cada operador será um nó com dois filhos: o primeiro é o operando esquerdo e o segundo é o operando direito. Cada variável será uma folha. Rotule as arestas com esquerdo e direito para preservar a ordem, independentemente do posicionamento visual.
Use um nó diferente para cada ocorrência de operador. Não crie nós para os parênteses.
Solução
Explicação
A divisão reúne o numerador inteiro e o denominador inteiro, por isso é a raiz. O numerador é uma multiplicação cujos operandos são duas expressões. No denominador, a soma reúne t e u. Trocar os operandos da subtração ou da divisão alteraria a expressão.
Objetivo de aprendizagem: modelar a estrutura de uma expressão preservando agrupamento e ordem dos operandos.
Resposta esperada
flowchart TD
divide["/"] -->|esquerdo| multiply["*"]
divide -->|direito| denominator["+"]
multiply -->|esquerdo| subtract["-"]
multiply -->|direito| add["+"]
subtract -->|esquerdo| p["p"]
subtract -->|direito| q["q"]
add -->|esquerdo| r["r"]
add -->|direito| s["s"]
denominator -->|esquerdo| t["t"]
denominator -->|direito| u["u"]
Exercício 20: interpretar e calcular uma expressão
Calcule o valor da expressão representada na árvore para a = 3, b = 5, c = 10 e d = 6. Cada operador usa o filho esquerdo como primeiro operando e o direito como segundo. Mostre a expressão entre parênteses e o resultado de cada operação antes do resultado final.
flowchart TD
divide["/"] -->|esquerdo| add["+"]
divide -->|direito| subtract["-"]
add -->|esquerdo| a["a"]
add -->|direito| b["b"]
subtract -->|esquerdo| c["c"]
subtract -->|direito| d["d"]
Solução
Explicação
A raiz divide os resultados das duas subárvores. Primeiro obtemos o valor da soma e o da subtração. O denominador é 4, portanto a divisão está definida. Não basta ler os rótulos da esquerda para a direita sem considerar o agrupamento.
Objetivo de aprendizagem: recuperar e calcular uma expressão a partir da hierarquia de seus operadores e operandos.
Resposta esperada
Expressão: . Soma: . Subtração: . Resultado final: .