You are on page 1of 19

Web Aula 1

Introdução a Árvores e Grafos.
Árvores

É bem provável que a estrutura não linear de maior aplicação em computação é a estrutura de árvore, ou simplesmente, árvore, que pode ser definida da seguinte maneira:

Uma árvore A é um conjunto finito de N nodos, tal que N > O. Então: 1 2 A1 ,..., – Existe – Os A
m

um N-1 sendo ,

nodo nodos que

especial, estão cada um é,

chamado em por sua

raiz m vez,

da conjuntos uma

árvore; disjuntos, árvore.

restantes

particionados

Essas árvores A1 ,... Am são chamadas subárvores da raiz.

Esta é uma definição recursiva, ou seja, definimos árvore em função de árvores. A recursividade aqui é utilizada como uma ferramenta para a definição de um padrão fundamental de estruturação. Na definição de listas lineares, utilizamos o sequenciamento (ou a repetição) como padrão fundamental de estruturação e comportamento. É importante observar que podemos utilizar a recursividade para expressar sequenciamento ou repetição, como m:

Uma lista linear é um conjunto finito de N nodos, tal que, se N > O, então: 1. Existe um modo especial que precede todos os demais;

2. Os restantes N - 1 nodos formam uma lista linear.

A recíproca, no entanto, não é verdadeira (Wirth, 1976). Podemos utilizar a recursividade para definir de uma maneira elegante e concisa estruturas com um grau de sofisticação muito além da capacidade da repetição ou do sequenciamento. A definição de árvores é um exemplo clássico Existem diversas maneiras de se representar graficamente uma árvore, e a figura 1.25 mostra algumas delas (as principais), para a árvore {A,B,C,D,E,F}.

Nesta árvore. C(G))) . e {B. {D}.. {E} e {F} ]são subárvores da raiz B. 1) Grafo 2) Conjuntos Superpostos (Também conhecidos como DIAGRAMA DE VENN) 3) Parênteses (A(B(D. G} são subárvores de A.E. E. D. A é a raiz.F). e {G} é subárvore da raiz C. F} e {C.

E. Na verdade. folha.25:     A possui grau 2 B grau 3 C grau 1 D. sendo folhas.25 de uma forma bastante incomum entre as árvores da natureza: com a raiz em cima e as folhas em baixo. teve sua origem na representação de estruturas hierárquicas por árvores. um nodo de grau 0 é chamado nodo terminal. . significativamente. Na árvore da figura 1. Repare que a representação em forma de grafo. ou. este é um costume generalizado em computação e. provavelmente. apesar de ser a que mais justifica o nome dado à estrutura.4) Paragrafamento ou Identação Grau de um nodo é o número de subárvores que possui. portanto. está desenhada na figura 1. F e G possuem grau 0.

Definimos nível de um nodo. C está “acima” de D e E. Dizemos. . pode parecer bizantina à primeira vista.26 deve ser seguida. por exemplo. arbitrariamente. da seguinte maneira: 1 . com relação a uma árvore T. mas existe uma terminologia associada com a disposição gráfica dos nodos que já se tornou padrão. então. as raízes de suas subárvores estão no nível i + 1. ou então que é o nodo “mais à esquerda” da árvore. Somente a representação (A) está coerente com esta terminologia. O nível da raiz de T é 1. que B e C estão “abaixo” de A. Se um nodo X está no nível i. (b) ou (c) da figura 1. 2.Uma discussão sobre qual das maneiras (a).

nesse caso. Se esta ordem é irrelevante.28 são .. naturalmente... etc.27 mostra a árvore da figura 1.. A é o “pai” deles. dizemos que A é a primeira subárvore da raiz.A figura 1. etc.. Am na definição é importante.27. e. B e C são “irmãos”. que por sua vez são “filhos” de B e “sobrinhos” de C. A2 a segunda. dizemos que equivalentes. Dizemos que uma árvore é ordenada quando a ordem das subárvores A1 . E e F...25 com os níveis de seus nodos indicados. o que não a Árvore é orientada. no sentido em que as árvores da figura 1. B e C são “filhos” de A.. Uma outra terminologia para referenciar relações entre nodos de uma árvore baseia-se em relações familiares. assim como D. Na árvore da figura 1.

A distinção entre florestas e árvore é mínima: basta acrescentar um nodo a uma floresta que ela se transforma em uma árvore. por isso. são exemplos de árvores binárias. Uma floresta é um conjunto de zero ou mais árvores disjuntas. distingue-se entre uma subárvore à direita ou uma subárvore à esquerda. . Árvores genealógicas. Árvores ordenadas ocorrem mais frequentemente em computação e.29 são diferentes.30. como a da figura 1. isso quer dizer que as árvores binárias da figura 1. enquanto que toda árvore é uma floresta. E quando só existe uma subárvore presente. Em termos da representação por grafos. Uma árvore binária é uma árvore ordenada. Resultados de torneios de tênis são costumeiramente dados em forma de árvores binárias. dizemos simplesmente árvores ordenadas.ocorre no caso das árvores serem ordenadas. na qual cada nodo possui no máximo duas subárvores.

Ao trecho .Um ninho de se’s em programação pode também ser representado por uma árvore binária.

e a subárvore à esquerda. em cada nodo. à cláusula senão. a subárvore acima corresponde à cláusula então.Corresponde à árvore binária da figura 1.31 Onde. .

por si só. Além disso.Web Aula 2 Introdução a Árvores e Grafos. podemos representar qualquer floresta como árvore binária.32 pode ser representada pela árvore binária da figura 1. ÁRVORES BINÁRIAS A ocorrência de árvores binárias em computação é suficientemente grande para. justificar o seu estudo mais detalhado. . Por exemplo: a floresta formada pelas árvores da figura 1.33.

34 . Girando o diagrama da figura 1. unindo todos os filhos de uma mesma família (pelo “lado direito”). com exceção do “ primogênito”.Essa foi obtida da floresta. obtemos a árvore binária no esquema tradicional. e removendo todas as ligações de pai para filho. como mostra a figura 1.33 de 45º .

podemos dizer que a árvore binária da figura 1.35 corresponde à floresta da figura 1.36 .Invertendo o processo.

37 mostra a expressão. A figura 1.As transformações acima formam a chamada correspondência natural entre árvore binárias e florestas. Um exemplo interessante de árvore binária é uma expressão aritmética com operadores diádicos (com dois operandos). Cada operador possui como subárvores os seus operandos. . (a + b) * c – d / (e – f) em forma de árvore binária.

então. A árvore da figura 1.38 . REFERENCIA-NODO: ANTERIOR. tipo REFERENCIA-NODO = referência (NODO). PROXIMO). respectivamente. onde ANTERIOR e PROXIMO são referências para a subárvore da esquerda e da direita.A maneira tradicional de se representar uma árvore binária em um computador utiliza nodos do formato: tipo NODO = registro (INFORMAÇÃO : INFO.37 é. Para referenciar o nodo raiz da árvore. representada como mostra a figura 1. É necessário ainda um apontador REFERENCIA-NODO : RAIZ.

Um caminhamentocompleto através da árvore nos dá uma sequência de seus nodos.Um problema que surge em muitos algoritmos que manipulam árvores binárias é o de percorrer todos os seus nodos para examinar ou modificar seu conteúdo. é conveniente definir uma sistemática para o caminhamento. como em muitos algoritmos precisamos saber qual é o próximo nodo (ou o anterior). Os três principais métodos de caminhar através de uma árvore binária são: 1 ¿ Caminhamento em preordem Procedimento:   Visite a raiz. . Caminhe através da subárvore da esquerda em preordem (se existir). nesta sequência. de tal maneira que cada um dos nodos seja ¿visitado¿ exatamente uma vez.

* + abc/d . Caminhe através da subárvore da direita em preordem (se existir).ef a + b * c . seção 35). caminhe através da subárvore da direita em inordem (se existir) . Veremos agora algoritmos na forma de procedimentos recursivos para os três tipos de caminhamento. Aplicando as definições de caminhamento à árvore da Figura 1. mais uma vez. obtemos os seguintes arranjos:    Em preordem : Em inordem : Em preordem : . como característica fundamental da estrutura de árvore. . reconhecemos as formas prefixada./ - Nestes. A recursividade aparece aqui. infixada e posfixada de uma expressão. visite a raiz.f ab + c * def . e também a versão não recursiva do procedimento para caminhamento em inordem (procedimentos recursivos e não recursivos estão explicados no módulo 3.d/e . 2 ¿ Caminhamento em inordem Procedimento:   Caminhe através da subárvore da esquerda em inordem (se existir). Procedimento PREORDEM ( P ). 3 ¿ Caminhamento em posordem Procedimento:    caminhe através da subárvore da esquerda em posordem (se existir) Caminhe através da subárvore da direita em posordem (se existir). Visite a raiz.37.

REFERENCIA-NODO: P. INORDEM (P ^ . PREORDEM ( P ^ . Procedimento POSORDEM ( P ) . REFERENCIA-NODO : P . “visita P ^ “ . REFERENCIA-NODO : P . ANTERIOR ) . PROXIMO ) Fim se Fim Fim INORDEM. . Procedimento INORDEM ( P ). ANTERIOR ). PREORDEM ( P ^ . Início Se P ≠ Λ Entuão INORDEM ( P ^ . Início Se P ≠ Λ Então “visita P ^ “ . PROXIMO) Fim se Fim Fim PREORDEM.

Início tipo PILHA NODO PILHA inteiro : TOPO : = 0 . P : = P ^ . PROXIMO ) . o procedimento não recursivo para o caminhamento em inordem: procedimento INORDEM (P). “visita P ^ ” Fim se Fim Fim POSORDEM . PILHA [ TOPO ] : = P Fim se .Início Se P = ^ Então POSORDEM ( P ^ . . Agora. ANTERIOR ) . ANTERIOR DE APONTADORES TOPO : PILHA. . POSORDEM ( P ^ . REFERENCIA-NODO : P . Senão TOPO : = TOPO + 1 . Repita Se P ≠ Λ Então { “ P => PILHA } Se TOPO = 30 Então “OVERFLOW “ . DE APONTADORES = [ 1:30 ] REFERENCIA.

mas que. É bom lembrar que existe um mecanismo de pilha implícito nos procedimentos recursivos. faz-se necessária antes a execução de sua subtarefa (ou subtarefas). e por esta razão esse método não é tão utilizado quanto os demais. já que em cada chamada recursiva é gerada uma nova “encarnação” das variáveis internas. PROXIMO Fim se Fim se Até TOPO = 0 e P = Λ Fim Fim INORDEM . para tanto. {“ P ← PILHA }     Uma comparação entre este algoritmo e seu correspondente recursivo dá uma medida do fato que operações em estruturas de dados definidas recursivamente são programadas mais adequadamente por procedimentos recursivos. TOPO : = TOPO – 1 . o algoritmo não recursivo é um pouco mais complicado. “ visita P ^ “ . a pilha cumpre a sua missão tradicional de lembrar de coisas que devem ser feias.Senão se TOPO > 0 Então P : = PILHA [TOPO] . Na versão não recursiva. Para o caminhamento em posordem. . Uma pilha é o mecanismo essencial para implementação de recursividade. O algoritmo não recusivo para caminhamento em preordem é análogo ao apresentado para inordem. P : = P ^ .

Quando um programa chama uma função e dentro dessa função existe uma chamada para ela mesma. esperando o encerramento da segunda. as anteriores passarão a ser resolvidas. . Pode acontecer de serem criadas várias chamadas. Recursividade: está relacionada ao uso de programas com funções. dependendo do problema. uma nova chamada de execução é criada (para a segunda chamada). enquanto que a primeira permanece parada. Uma vez encerradas as chamadas. temos um programa recursivo. Nesse caso.