Você está na página 1de 7

SISTEMAS DE INFORMAÇÃO

ESTRUTURA DE DADOS II
2024-1

Árvores
As árvores são uma das estruturas mais importantes da área de computação, com utilização em
muitas aplicações do mundo real. Neste tipo de estrutura, os relacionamentos lógicos entre os
dados representam alguma dependência de hierarquia ou composição entre os nodos, formando
uma hierarquia de subordinação.

Representação gráfica de uma árvore

Figura 1- Representação gráfica tradicional

Figura 2 - Representação por Diagrama de Inclusão

Figura 3 - Representação por Diagrama de Barras

Figura 4 - Representação Aninhada ou Parentetizada

Figura 5 - Representação Não Parentetizada

Figura 6 - Representação de Numeração por Nível

1
Terminologia

Raiz - É um nodo diferenciado, presente em todas as árvores, ao qual são subordinados todos os
outros nodos da árvore. O acesso a todos os nodos da árvore é sempre feito a partir de sua raiz.

Nodos descendentes : São os nodos que apresentam alguma relação de dependência com um
nodo mais acima na hierarquia representada pela árvore.
Uma forma usual de indicar os graus de dependência entre os nodos, provavelmente originária de
árvores genealógicas, é o de chamar os descendentes diretos de um nodo de filhos (filhas ou
sucessores) deste nodo, e o nodo em questão, de pai (mãe, ascendente ou antecessor) de seus
descendentes diretos. Assim, todos os descendentes diretos de um nodo são denominados de
irmãos (irmãs) entre si.

Subárvore - É um conjunto de nodos, sendo todos eles subordinados a um único nodo, externo a
esta subárvore.

Grau de um nodo - Denomina-se de grau de um nodo ao número de subárvores que são


subordinadas diretamente a este nodo, ou seja, à quantidade de subárvores para as quais este
nodo é a raiz. Às vezes é também denominado de grau de saída do nodo, representando o número
de descendentes que este nodo apresenta.

Grau de uma árvore - O grau de uma árvore é o maior valor dentre os graus de todos os seus
nodos.

Folha ou terminal (externo) - Os nodos de grau zero (que não apresentam descendentes) são
denominados folhas ou terminal. Os nodos de grau maior do que zero e que, consequentemente,
apresentam alguma subárvore, são denominados nodos de derivação ou nodos internos.

Nível de um nodo - O nível de um nodo corresponde ao número de ligações entre este nodo e a
raiz da árvore, acrescido de uma unidade. A raiz de uma árvore tem sempre nível 1 (alguns
autores dizem que a raiz de uma árvore sempre está no nível o). Os nodos ligados diretamente a
ela apresentam nível 2.

Caminho - Um caminho consiste em uma sequência de nodos consecutivos distintos entre dois
nodos.

Comprimento do caminho - Dado um determinado caminho entre dois nodos, o comprimento


deste caminho é determinado pelo número de níveis entre estes dois nodos, diminuído de uma
unidade.

Altura ou profundidade - A altura de um dado nodo é o número de nodos do maior caminho deste
nodo até um de seus descendentes-folha. A altura ou profundidade da árvore é igual ao maior nível
de seus nodos. Todos os nodos-folha possuem altura 1.

Floresta - É formada por um conjunto de zero ou mais árvores disjuntas.

2
Árvores n-árias
Uma árvore n-ária (onde este n nunca será trocado por um número) apresenta o grau livre para
cada nodo. Não há restrição de filhos para os nodos que a compõem.

Figura 7 - Exemplo de uma árvore n-ária

Operações sobre árvores n-árias

Criação de uma árvore vazia - Criar uma árvore n-ária significa tão somente inicializar o ponteiro
que irá guardar o endereço de seu nodo raiz. O valor deste ponteiro é inicializado no endereço
nulo, indicando que esta árvore está vazia, ou seja, que sua raiz ainda não foi alocada.
O nodo raiz somente será alocado fisicamente quando for inserido o primeiro nodo na árvore.

Inserção de um novo nodo - O primeiro nodo a ser inserido em qualquer árvore, seja ela n-ária
ou não, é aquele que representará a sua raiz. Todas as demais inserções de nodos serão feitas
como descendentes de algum nodo já definido. Para a inserção deve-se informar quem será o nodo
pai. Cada novo nodo incluído será um nodo folha e será irmão dos demais nodos filhos do seu pai.

Remoção de um nodo - A remoção de um nodo de uma árvore é geralmente complexa, implicando


quase sempre em uma reorganização de parte desta árvore. A remoção de um nodo pode ser feita
de duas formas:
Remoção lógica - o nodo não é fisicamente excluído. Alguma informação especial contida no
próprio nodo informa que este não é mais válido. A estrutura da árvore é integralmente preservada.
Esta não é a solução ideal no caso de a aplicação remover muitos nodos, pois todos ficarão
alocados, ocupando espaço e fazendo com que pesquisas se tornem mais demoradas, uma vez
que todos os nodos removidos também são analisados;
Remoção física - o nodo é fisicamente excluído. Se o nodo considerado é uma folha, ele é
simplesmente liberado, devendo ser atualizado o elo de seu nodo pai. Entretanto, caso se trate de
um nodo interno, deve-se adotar uma política quanto a possibilidade de um nodo interno ser
removido ou não. Caso não seja permitido, a exclusão é abortada, caso contrário, poderá ser
necessário uma reorganização da árvore.

3
Árvores Binárias
Uma árvore binária apresenta o grau de cada nodo sempre menor ou igual a 2 (ou seja, cada nodo
apresenta no máximo dois descendentes).

Figura 8 - Exemplo de uma árvore binária

Existem três tipos especiais de árvores binárias:

Árvore estritamente binária (Figura 7a) - toda a árvore em que cada nodo tem grau o ou 2, ou
seja, quando todo nodo apresenta 0 ou 2 filhos;

Árvore binária completa (Figura 7b) - é uma árvore estritamente binária na qual todo nodo que
apresente alguma subárvore vazia está localizado no último (folha) ou no penúltimo nível desta
árvore;

Árvore binária cheia (Figura 7c) - quando todas as folhas estão à mesma profundidade, e todos
os nodos internos têm grau 2. Uma árvore cheia é completa e estritamente binária.

Figura 9 - Tipos especiais de árvores binárias

Operações sobre árvores binárias

Criação de uma árvore vazia - Criar uma árvore binária significa tão somente inicializar o ponteiro
que irá guardar o endereço de seu nodo raiz. O valor deste ponteiro é inicializado no endereço
nulo, indicando que esta árvore está vazia, ou seja, que sua raiz ainda não foi alocada.
O nodo raiz somente será alocado fisicamente quando for inserido o primeiro nodo na árvore.

Inserção de um novo nodo - O primeiro nodo a ser inserido em qualquer árvore, seja ela binária
ou não, é aquele que representará a sua raiz. Todas as demais inserções de nodos serão feitas
como descendentes de algum nodo já definido. Para a inserção deve-se informar quem será o nodo
pai e se será filho a esquerda ou a direita. A inserção somente será realizada se este descendente
específico ainda não estiver presente.

4
Remoção de um nodo - A remoção de um nodo de uma árvore é geralmente complexa, implicando
quase sempre em uma reorganização de parte desta árvore. A remoção de um nodo pode ser feita
de duas formas:
Remoção lógica - o nodo não é fisicamente excluído. Alguma informação especial contida no
próprio nodo informa que este não é mais válido. A estrutura da árvore é integralmente preservada.
Esta não é a solução ideal no caso de a aplicação remover muitos nodos, pois todos ficarão
alocados, ocupando espaço e fazendo com que pesquisas se tornem mais demoradas, uma vez
que todos os nodos removidos também são analisados;
Remoção física - o nodo é fisicamente excluído. Se o nodo considerado é uma folha, ele é
simplesmente liberado, devendo ser atualizado o elo de seu nodo pai. Entretanto, caso se trate de
um nodo interno, a árvore deverá ser reorganizada.

Acesso aos nodos – Geralmente se necessita acessar todos os nodos de uma árvore com o
objetivo de realizar a mesma operação sobre todos eles (por exemplo, procurar um determinado
nodo, imprimir os campos de informação de todos os nodos, atualizar o valor de todos os ‘produtos’
etc.). À realização desta operação sobre um nodo denominamos de visita ao nodo. A operação
pretendida (visita) deve ser realizada somente uma vez sobre o nodo. É necessário definir uma
estratégia de percurso desta árvore para que isso seja possível. Denomina-se caminhamento de
uma árvore o método de percurso sistemático de todos os nodos da árvore, de modo que cada
nodo seja visitado exatamente uma vez. Um caminhamento completo define uma sequência de
nodos, de maneira que cada nodo da árvore passa a ter um nodo seguinte, ou um nodo anterior,
ou ambos (exceto árvores de um só nodo). Todos os nodos da árvore devem aparecer nesta
sequência, cada um apenas uma vez. A ordem em que os nodos aparecem no caminhamento
completo representa a ordem em que será feita a visita aos nodos.
O objetivo buscado - acessar todos os nodos da árvore - pode ser alcançado através de diferentes
caminhamentos. A sequência de nodos obtida será diferente conforme o caminhamento utilizado.
Como uma árvore binária apresenta no máximo dois descendentes em cada nodo, ela pode ser
vista como composta por sua raiz, com uma subárvore à esquerda desta raiz e outra subárvore à
sua direita. Os caminhamentos na árvore binária são definidos pela ordem em que são visitados
estes três elementos - a raiz e suas duas subárvores. Cada subárvore é também uma árvore
binária, com uma raiz com suas duas subárvores. Visitar uma subárvore significa visitar todos os
nodos desta subárvore, utilizando para estas visitas o mesmo caminhamento.
Os principais caminhamentos para árvores binárias são apresentados a seguir, juntamente com a
ordem em que devem ser realizadas as operações correspondentes sobre a árvore.

• Caminhamento pré-fixado (RED)


1. visitar a raiz
2. percorrer e visitar a subárvore da esquerda
3. percorrer e visitar a subárvore da direita

• Caminhamento infixado (ERD)


1. percorrer e visitar a subárvore da esquerda
2. visitar a raiz
3. percorrer e visitar a subárvore da direita

• Caminhamento pós-fixado (EDR)


1. percorrer e visitar a subárvore da esquerda
2. percorrer e visitar a subárvore da direita
3. visitar a raiz

5
Árvores Binárias de Pesquisa (ABP)
Binary Search Tree (BST)
Uma árvore binária de pesquisa inicialmente e obrigatoriamente é uma árvore binária. O que
diferencia a binária de pesquisa da binártia convencional é a regra:

Todo e qualquer descendente à esquerda de um nodo terá menor ao contido no nodo.


Todo e qualquer descendente à direita de um nodo terá valor maior ao contido no nodo.

Sobre valores duplicados, podem ser aceitos os não. Caso sejam aceitos, ele será ou descendente
a esquerda do nodo de mesmo valor, ou descendente a direita. Tanto faz, desde que seja
respeitado sempre a mesma regra quando for igual. Se a esquerda, todos os iguais serão
descendentes a esquerda. Se a direita, todos os iguais serão descendentes a direita.

Figura 10 - Exemplo de uma árvore binária de pesquisa

Operações sobre árvores binárias de pesquisa

Criação de uma árvore vazia - Criar uma árvore binária significa tão somente inicializar o ponteiro
que irá guardar o endereço de seu nodo raiz. O valor deste ponteiro é inicializado no endereço
nulo, indicando que esta árvore está vazia, ou seja, que sua raiz ainda não foi alocada.
O nodo raiz somente será alocado fisicamente quando for inserido o primeiro nodo na árvore.

Inserção de um novo nodo - O primeiro nodo a ser inserido em qualquer árvore é aquele que
representará a sua raiz. Todas as demais inserções de nodos serão feitas como descendentes de
algum nodo já definido. Para a inserção na árvore binária de pesquisa basta informar o valor a ser
inserido. A posição onde será inserido será definido levando em conta a regra básica das árvores
binárias de pesquisa, os valores já existentes na árvore e o valor a ser inserido.

Remoção de um nodo - A remoção de um nodo de uma árvore é geralmente complexa, implicando


quase sempre em uma reorganização de parte desta árvore. A remoção de um nodo pode ser feita
de duas formas:
Remoção lógica - o nodo não é fisicamente excluído. Alguma informação especial contida no
próprio nodo informa que este não é mais válido. A estrutura da árvore é integralmente preservada.
Esta não é a solução ideal no caso de a aplicação remover muitos nodos, pois todos ficarão
alocados, ocupando espaço e fazendo com que pesquisas se tornem mais demoradas, uma vez
que todos os nodos removidos também são analisados;
Remoção física - o nodo é fisicamente excluído. A remoção de um nodo numa árvore binária
de pesquisa deve levar em consideração o grau do nodo a ser excluído:

6
• Grau 0 : Caso o nodo a ser removido for a raiz, a árvore ficará vazia. Caso contrário, o nodo
pai do nodo a ser removido deixa de ter como filho a esquerda ou direita o nodo a ser
removido e a remoção estará realizada.

• Grau 1 : Caso o nodo a ser removido for a raiz, a raiz passará a ser o único filho que ele
possui. Caso contrário, o nodo pai deixa de ter como filho a esquerda ou direita o nodo que
será removido e passará a ter como filho naquele lado o único filho que o nodo a ser
removido possui.

• Grau 2 : Neste caso, primeiramente deve buscar na árvore o seu nodo antecessor ou seu
nodo sucessor. Qualquer um é válido, desde que esta seja a regra para todas as remoções
de nodos de grau 2. Uma vez achado o antecessor/sucessor, substitui-se as informações do
nodo a ser excluído com as informações do seu nodo antecessor/sucessor. Após, deve-se
observar com que grau ficou o nodo a ser excluído (grau 0 ou 1) e fazer a exclusão conforme
o grau, como visto nos casos anteriores.

Acesso aos nodos – Segue a mesma formula do acesso aos nodos de uma árvore binária que
não seja de pesquisa. Tem-se os caminhamentos pré-fixado, infixado e pós-fixado.

Você também pode gostar