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 nn 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 n=3n=3, e de uma árvore binária, na qual n=2n=2.

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 / FilhoRABCD
R01100
A00010
B00001
C00000
D00000

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 / FilhoRABCDE
R011000
A000110
B000001
C000000
D000000
E000000
  1. Quantas células e quantos bytes a matriz reserva ao todo?
  2. Quantas células contêm 0 e quantos bytes elas ocupam? Esses bytes estão realmente livres? Justifique.
  3. 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 6×6=366\times6=36 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 36−5=3136-5=31 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 NN nós, a matriz reserva N2N^2 células, mas existem somente N−1N-1 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ó, nn, não é o total de nós, NN. Uma árvore binária tem n=2n=2 e pode ter milhares de nós. A escolha da representação precisa distinguir essas duas quantidades.

Quando nn é 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á NN referências de início de lista e N−1N-1 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 nn é pequeno e fixo: um vetor de nn índices de filhos por nó pode ser mais adequado. Ele reserva N×nN\times n posições, não N2N^2, 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 nn. 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

  1. 36 células e 36 bytes, pois 6×6=366\times6=36.
  2. 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.
  3. 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 nn índices por nó reserva poucas posições e dispensa as referências de encadeamento. A matriz reserva N2N^2 células. As listas usam NN referências de início e N−1N-1 elementos, e os vetores reservam N×nN\times n posições. Aqui, NN é o total de nós e nn é 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ó: índicePosição 1Posição 2Posição 3
L: 0123
M: 14−1−1
N: 25−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_1 passa de D para NULL.
  • C: child_1 passa de NULL para D.
  • D: parent passa 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"))
  1. 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.
  2. 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.
  3. Por que X e Y apontam diretamente para NULL na 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

  1. 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.
  2. 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.
  3. X e Y são folhas. Seus registros existem na coleção principal, mas suas listas de filhos estão vazias. NULL indica 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 6×3=186\times3=18 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: 6+5×2=166+5\times2=16. 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çãoNecessidade
Pastas de um sistema operacionalRegistrar qual pasta contém cada subpasta
Árvore de pesquisa em inteligência artificialRepresentar alternativas de estados para encontrar uma solução
CompiladorRepresentar 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.

(p−q)×(r+s)t+u\frac{(p-q)\times(r+s)}{t+u}

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: (a+b)/(c−d)(a+b)/(c-d). Soma: 3+5=83+5=8. Subtração: 10−6=410-6=4. Resultado final: 8/4=28/4=2.