01 2 arvores

28
1 ESTRUTURA DE DADOS II Prof KF. Árvores Prof KF. Adaptado de outras apresentações Sumário Definição de Árvore Representação Gráfica Classificação das Árvores Declaração de uma Árvore N-ária Declaração de uma Árvore Não N-ária Nível de um Nó Altura ou Profundidade de uma Árvore Percurso de uma Árvore Inserção em uma Árvore Remoção em uma Árvore Árvores Binárias Árvores Binárias de Busca Inserção em uma Árvore Binária de Busca Busca em uma Árvore Binária de Busca Deleção em uma Árvore Binária de Busca Ordens de Complexidade Árvore binária AVL Referências Bibliográficas Exercícios Usando Estruturas Dinâmicas A capacidade de alocação dinâmica é muito desejável em muitos casos. Mas as estruturas lineares, como listas ligadas, têm um problema por exigir acesso seqüencial.

Upload: jean-lopes

Post on 12-Jan-2016

68 views

Category:

Documents


12 download

DESCRIPTION

Estruturas de dados, Árvores

TRANSCRIPT

Page 1: 01 2 Arvores

1

ESTRUTURA DE DADOS II

Prof KF.

Árvores

Prof KF.Adaptado de outras apresentações

Sumário

� Definição de Árvore� Representação Gráfica� Classificação das Árvores� Declaração de uma Árvore

N-ária� Declaração de uma Árvore

Não N-ária� Nível de um Nó� Altura ou Profundidade de

uma Árvore� Percurso de uma Árvore� Inserção em uma Árvore

� Remoção em uma Árvore� Árvores Binárias� Árvores Binárias de Busca� Inserção em uma Árvore

Binária de Busca� Busca em uma Árvore

Binária de Busca� Deleção em uma Árvore

Binária de Busca� Ordens de Complexidade� Árvore binária AVL� Referências Bibliográficas� Exercícios

Usando Estruturas Dinâmicas

� A capacidade de alocação dinâmica é muito desejável em muitos casos.

� Mas as estruturas lineares, como listas ligadas, têm um problema por exigir acesso seqüencial.

Page 2: 01 2 Arvores

2

Estruturas não Lineares

� Uma solução para este problema pode ser através do uso de estruturas não lineares. Ex: Dividir a lista em duas.

X

Menores que X

Maiores que X

Estruturas não Lineares

O problema de dividir a lista em duas é que isto apenas “divide o problema em dois”.

X

Menores que X

Maiores que X

Estruturas não Lineares

Uma solução mais robusta consiste em dividir a lista a cada elemento.

X

X< Y

Y< X

X< Y< Z

X<Z< Y

Y<Z<X

Z< Y<X

Árvores. Estruturas dinâmicas com:

Folhas: nós sem filhos

Raiz

pai

filho à dir.filho à esq.

ancestral

descendente

Nó, Nodo

ou Vértice

Page 3: 01 2 Arvores

3

Árvore Definição de Árvore

� Estrutura de dados não linear;

� Um grafo totalmente conexo e acíclico;� Analogia a uma árvore (reino vegetal):

� Raiz;

� Folhas;� “galhos” ou sub-árvores – conceito de poda.

Representação Gráfica Classificação das Árvores

� Uma árvore pode ser classificada de diversas formas. Uma delas é pelo número máximo de nós-filhos que cada nó-pai pode ter:� Binária (dois nós);� Ternária (três nós);� Quaternária (quatro nós);� N-ária (N nós);� Não N-ária (quando não conhecemos ou não

há um número máximo de nós-filhos para cada nó-pai).

Page 4: 01 2 Arvores

4

Declaração de uma Árvore N-ária

const N = 2;type

PNo = ^Tno;TNo = record

valor: integer;filhos: array [1..N]

of PNo;end;

TArvore = PNo;

Declaração de uma Árvore Não N-ária

typePNo = ^TNo;TNo = record

valor: integer;irmao: PNo;filho: PNo;

end;TArvore = PNo;

Exemplos de árvores Expressões aritméticas

� Árvores binárias são utilizadas para representar expressões aritméticas de forma que a prioridade dos operadores fique bem definida.

� A expressão A * B - C / ( D + E ) pode ser representada da seguinte forma:

Page 5: 01 2 Arvores

5

Expressões aritméticas

-

* /

A C +

D E

B

expressão A * B - C / ( D + E )

Armazenamento de dados

� As árvores binárias podem ser utilizadas também para o armazenamento de dados.

� Independente da ordem de armazenamento, os dados podem ser retirados da árvore de forma ordenada.

� Para os seguintes dados G, T, F, H, R, A, X, E, e L, uma representação em ordem alfabética poderia ser:

Armazenamento de dados

G

F

A

E

T

H

R

L

X

dados G, T, F, H, R, A, X, E, e L

Formas de visualização

�Representação hierárquica

Page 6: 01 2 Arvores

6

Formas de visualização

�Representação por conjuntos (diagrama de inclusão)

Formas de visualização

� Representação por expressão de parênteses aninhados

� Cada conjunto de parênteses correspondentes contém um nodo e seus filhos.

Formas de visualização

� Representação por expressão sem parênteses� Cada nó é seguido por um número que indica a quantidade de filhos desse nó, e em seguida por esses filhos, representados do mesmo modo.

Formas de visualização

�Representação por “identação” (diagrama de barras)

Page 7: 01 2 Arvores

7

Formas de visualização

� Pode-se representar uma árvore de vários outros modos, mas é interessante notar que, dentre os exemplos apresentados, a primeira representação é a que permite uma melhor visualização, e que será utilizada a partir deste ponto. � As representações “por expressão com parênteses” e “por expressão sem parênteses”não permitem boa visualização da estrutura, mas podem ser úteis para guardar em arquivos os dados de uma árvore.

O que não é uma Árvore

� Como, por definição, os subconjuntos s1, s2,...,sm são disjuntos, cada nó só pode ter um pai. Assim, o desenho abaixo, por exemplo, não representa uma árvore:

Nível de um Nó

� Refere-se à distância do mesmo até a raiz;

0

1

2

3

Definições

� Altura (também denominada Profundidade) é a distância entre um nodo x e o seu descendente mais afastado. Mais precisamente, a altura de x é o número de passos do mais longo caminho que leva de x até uma folha mais um.� Por definição a altura de uma árvore vazia é -1

E

/ \

D I

/ / \

B G K

/ \ / \ /

A C F H J

Altura dessa árvore é 3

Altura de J é 0

Altura de K é 1

Altura de I é 2

Page 8: 01 2 Arvores

8

Altura ou Profundidade de uma Árvore

� É o nível máximo que um nó da árvore atinge;

0

1

2

3

A altura desta árvore é 3! Ela possui 4 níveis!

Definições

�O grau da árvore é igual ao grau do nodo de maior grau da árvore.

Definições

� Floresta: é um conjunto de zero ou mais árvores disjuntas, ou seja, se for eliminado o nó raiz da árvore, as sub-árvores que restarem chamam-se de florestas

Percurso de uma Árvore

� Também conhecido como travessia;

� Consiste em percorrer (em uma dada ordem) todos os nós de um árvore ou até encontrar algum que satisfaça ao problema em questão;

� É empregado, por exemplo, na busca de um nó a partir de uma chave;

Page 9: 01 2 Arvores

9

Percurso de uma Árvore

� Tipos� Pré-ordem / pre-order;

� Em-ordem / in-order;� Pós-ordem / pos-order.

Percurso Pré-Ordem

� Processa primeiro a informação do nó atual, para só então processar a informação de seus filhos;

função x (no)Início

processa no;aplica função x para cada filho de no;

Fim;

Percurso Pré-Ordem

function buscaTelefone(no: PNode; nome: String): String;var s: String;Begin

if no = nil thenbuscaTelefone := “”

else if no.nome = nome thenbuscaTelefone := no.telefone

elsebegin

s := buscaTelefone(no.filho1, nome);if s <> “” then

buscaTelefone := selsebegin

s := buscaTelefone(no.filho2, nome);if s <> “” then

buscaTelefone := selse

buscaTelefone := “”;end;

end;End;

Percurso Em-Ordem

� Neste caso, um filho (ou parte dos filhos) éprocessado primeiro, o nó atual é então processado e, por fim, o outro filho (ou parte dos filhos);

função x (no)Início

aplica função x para parte dos filhos de no;processa no;aplica função x para parte dos filhos de no;

Fim;

Page 10: 01 2 Arvores

10

Percurso Pós-Ordem

� Neste caso, todos os filhos do nó atual devem ser processados antes que o mesmo o seja;

função x (no)Início

aplica função x para cada filho de no;processa no;

Fim;

Percorrendo uma árvore binária

Inserção em uma Árvore

� Cria-se o novo nó (método new) e alimenta-se o mesmo com as informações desejadas;

� Pode utilizar algum critério para determinar em qual nó e em qual posição o novo nódeverá ficar;

� O pai deve apontar para o filho.

Remoção em uma Árvore

� Utiliza-se de um outro ponteiro ( t ) para apontar para o objeto que se deseja remover;

� Após isso, reorganiza-se seus filhos a fim de que seu pai possa apontar para esses e ninguém ficar “abandonado”, eliminando o vínculo entre a árvore e o nó-alvo;

� Por fim, elimina-se o nó (método dispose);� E se nosso objetivo for remover TODOS os nós de

uma árvore, qual método de percurso você utilizaria? Por quê?

Page 11: 01 2 Arvores

11

Exercício sobre árvores (vale nota)

� 1 - A partir da árvore apresentada a seguir, representada através de parênteses aninhados, ( A (B) ( C (D (G) (H)) (E) (F (I)) ) ) construa a árvore através de:� a) diagrama de inclusão;� b) representação hierárquica;� c) Representação por expressão sem parênteses.� d) por “identação”.

� 2 -Para a árvore criada:� a) Quantas sub árvores contém(a raiz)?� b) Quais os nós folha?� c) Qual o grau de cada nó?� d) Qual o grau da árvore?� e) Liste os ancestrais dos nós B, Ge I.� f) Identifique as relações de parentesco entre os nós. � g) Liste os nós de quem C é ancestral.� h) Liste os nós de quem D é descendente.� i) Dê o nível e altura do nó F.� j) Dê o nível e altura do nó A. � k) Qual a altura da árvore?� l) A árvore é balanceada?

� 3 -Para uma árvore de grau 5, com o número máximo de nós:� a) Qual o grau dos nós internos da árvore?� b) Qual o grau dos nós folhas?� c) Quantos nós tem a árvore se a altura é 5?� d) Qual a altura da árvore se o grau é d e o número de nós é n, e n é o número máximo de

nós?

Árvores Binárias

� Árvores onde cada nó possui no máximo dois filhos;

� Muito usadas em computação;

� Cada nível pode ter no máximo 2N nós, onde N é o valor do nível;

� Quantidade de níveis que uma árvore binária com N nós pode ter:� Máximo: N; (árvore degenerada)� Mínimo: Log2 (N + 1); (árvore completa)

Árvores Binárias

� Dado um nó qualquer, ele possuirá uma sub-árvore esquerda e uma sub-árvore direita (podendo qualquer uma delas ou ambas não possuir elementos);

Sub-árvoreesquerda

Sub-árvoredireita

Árvores binárias

A

B

A

B

Árvores não binárias Árvores binárias

A A

B B

As duas árvores são iguais As árvores são diferentes

Page 12: 01 2 Arvores

12

Árvores Binárias de Busca

� Ou árvores de busca binária (tanto faz!);

� São árvores em que é possível determinar em que direção buscar um dado nó a partir do valor do pai e levando-se em consideração alguma regra quanto àdisposição dos filhos;� Nós com valores menores que o pai à esquerda, nós

com valores maiores que o pai à direita;� Nós que satisfazem uma condição expressa pelo pai

de um lado e nós que não satisfazem do outro;

� O que acontecerá se a árvore de busca não estiver bem balanceada?

Árvores Binárias de Busca

� O que acontecerá se a árvore de busca não estiver bem balanceada?

20

12

18

16

14

Isto é uma Lista Encadeada;A busca é

sequencial!!

Qual a vantagem de usar estrutura de árvore então?

Árvores binárias onde os elementos são organizados de forma que:

Árvore de Busca Binária

• Todos os elementos na sub-árvore esquerda de cada nó k têm valor menor ou igual ao valor no nó k.

• Todos os elementos na sub-árvore direita de cada nó k têm valor maior do que o valor no nó k.

Árvore binária onde os elementos são organizados de forma que:

Árvore de Busca Binária

y < x z > x

x

Page 13: 01 2 Arvores

13

Exemplo: 50, 20, 39, 8, 79, 26, 58, 15,88, 4, 85, 96, 71, 42, 53.

Árvore de Busca Binária

50

20

8

4 15

39

26 42

79

58

53 71

88

85 96

Estrutura de dados dinâmica, com recuperação em tempo logarítmico.

Árvore de Busca Binária

1

2

3

4

Número de acessos máximo = Log 2 (nro_nós +1)Equivale ao número de níveis.

Ocorre sempre em uma folha.

Inserção em Árvores de Busca

Procedimento Inclui (raiz, x):Se raiz então

se elemento na raiz > x então Inclui (esquerda, x)senão Inclui (direita, x)

senão { aloque espaço para um nó;coloque x neste nó;

retorne apontador novo nó}

Inserção em uma Árvore Binária de Busca

function inserir(var arvore: TArvore; valor: integer): boolean;

var p, t: PNode;Begin

new(p);p.valor := valor;p.filho[1] := nil;p.filho[2] := nil;

a if arvore = nil then beginarvore := p; inserir:=true; end

a else1 begin

t := arvore;while t <> nil do

2 beginb if (t^.valor > valor) then3 beginc if t^.filho[1] = nil then4 begin

t^.filho[1] := p; inserir := true; exit;4 end

c elset := t^.filho[1];

3 endb,d else if t^.valor < valor then5 begine if t^.filho[2] = nil then6 begin

t^.filho[2] := p; inserir := true; exit;6 ende else

t := t^.filho[2];5 endd else7 begin

inserir := false;exit;

7 end;2 end;

inserir := false;1 end;

Page 14: 01 2 Arvores

14

Busca em uma Árvore Binária de Busca

function buscar(arvore: TArvore; valor: integer): PNode;

var t:PNode;Begin

if (arvore = nil) thenbuscar := nil

elsebegin

t := arvore;while (t <> nil) dobegin

if t .̂valor > valor thent := t .̂filho[1]

else if t .̂valor < valor thent := t .̂filho[2]

elsebegin

buscar := t;exit;

end;end;buscar := nil;

end;end;

Nem sempre é encontrado . ����

Remoção em Árvore de Busca

Procedimento Remove (raiz, x)EndNó ← Busca (x);Se ¬EndNó então relate insucesso

Exemplo: Remove (raiz, 60)

Remoção em Árvore de Busca

50

20

8

4 15

39

26 42

79

58

53 71

88

85 96

raizraizraizraiz

Remoção em Árvores de Busca

Procedimento Remove (raiz, x)EndNó ← Busca (x);Se ¬EndNó então relate insucesso senão se EndNó é folha (¬esq AND ¬dir )

então apague apontador pai;

Quando o nó é uma folha.

Page 15: 01 2 Arvores

15

Exemplo: Remove (raiz, 53)

Remoção em Árvore de Busca

50

20

8

4 15

39

26 42

79

58

53 71

88

85 96

raizraizraizraiz

Exemplo: Remove (raiz, 53)

Remoção em Árvore de Busca

50

20

8

4 15

39

26 42

79

58

71

88

85 96

raizraizraizraiz

nil

Remoção em Árvores de Busca

Procedimento Remove (raiz, x)EndNó ← Busca (x);Se ¬EndNó então relate insucesso senão se EndNó é folha (¬esq AND ¬dir )

então apague apontador pai; senão se ¬esq XOR ¬dir então

faça pai de x apontar para filho x

Nem sempre o nó a ser removido é uma folha. ���� Exemplo: Remove (raiz, 58)

Remoção em Árvore de Busca

50

20

8

4 15

39

26 42

79

58

71

88

85 96

raizraizraizraiz

Page 16: 01 2 Arvores

16

Exemplo: Remove (raiz, 58)

Remoção em Árvore de Busca

50

20

8

4 15

39

26 42

79

71

88

85 96

raizraizraizraiz

Remoção em Árvores de Busca

Procedimento Remove (raiz, x)EndNó ← Busca (x);Se ¬EndNó então relate insucesso senão se EndNó é folha (¬esq AND ¬dir )

então apague apontador pai; senão se ¬esq XOR ¬dir então

faça pai de x apontar para filho xsenão substitua x pelo seu sucessor

Exemplo: Remove (raiz, 20)

Remoção em Árvore de Busca

50

20

8

4 15

39

26 42

79

71

88

85 96

raizraizraizraiz

Onde está o sucessor de 20?

Onde está o sucessor de um elemento cujo nó tem filho à direita?

Remoção em Árvore de Busca

50

20

8

4 15

39

26 42

raizraizraizraiz

Um passo à direita.

Tantos passos à esquerda quantos sejam necessários para chegar a uma folha.

Note que o nó deste elemento

não tem filho à esquerda.

Page 17: 01 2 Arvores

17

Exemplo: Remove (raiz, 20)

Remoção em Árvore de Busca

50

26

8

4 15

39

42

raizraizraizraiz

Deleção em uma Árvore Binária de Busca

� Caso 1: Remover um nó que não possui filhos

Deleção em uma Árvore Binária de Busca

� Caso 2: Remover um nó que possui um filho

Deleção em uma Árvore Binária de Busca� Caso 3: Remover um nó que possui dois filhos

� Escolher o nó mais à esquerda da sub-árvore direita (ou mais à direita da sub-árvore esquerda) para “substituí-lo;

Page 18: 01 2 Arvores

18

Exemplo: 50, 20, 27, 42, 40 ...

Possível Problema

50

20

27

42

A árvore binária pode degenerar para uma estrutura próxima a uma lista encadeada, e o tempo de acesso deixará de ser logarítmico.

40

Procurar manter todas as folhas mais ou menos na mesma altura.

Solução

Árvores AVL

Criada em 1962 por Adelson-Velsky e Landis, éuma árvore binária balanceada que obedece a todas as propriedades da árvore binária e em que cada nó apresenta diferença de altura entre as sub-árvores direita e esquerda de 1, 0 ou –1.

Árvores AVL

� Árvores binárias de busca foram criadas para permitir um acesso rápido aos dados.

� Porém, dependendo da ordem de inserção dos dados o acesso não será muito eficiente.

� Para resolver este problema foram criadas as árvores balanceadas, também conhecidas como árvores AVL.

Page 19: 01 2 Arvores

19

Exemplo: 50, 20, 10, ...

Possível Problema

50

20Após a inserção do elemento 10, a árvore binária perde a propriedade AVL. A altura da sub árvore esquerda é 2 e da direita é 0. A diferença (em módulo) é maior que 1 e, portanto deixa de ser AVL.

10

Árvores AVL

1

2

3

4

5

2

4

5

1

3

Árvore não balanceada

Árvore AVL (balanceada)

Sumário

� Definição de Árvore AVL� Representação Gráfica� Operações

� Inserção� Remoção� Rotação (mantém a árvore binária como AVL)

� Simples� À Esquerda� À Direita

� Dupla� Pesquisa

� Referências Bibliográficas

Definição de Árvore AVL

� Trata-se de uma Árvore de Busca Binária Auto-Balanceada, isto é, que mantém o balanceamento de sua árvore em cada operação executada;

� A maior diferença possível entre os níveis de dois nós-folhas é 1;

Page 20: 01 2 Arvores

20

Definição de Árvore AVL Representação Gráfica

Árvore Não-Balanceada Árvore AVL (Balanceada)

Estas árvores são AVL?

Operações

� Inserção

� Remoção

� Rotação (manter balanceada!)� Simples (à esquerda ou à direita);� Dupla.

Inserção

� Efetua-se a busca pelo nó (igual a qualquer outra árvore de busca binária);

� Insere-se o nó;

� Verifica-se se ela está balanceada, caso não esteja, efetuar rotação (simples ou dupla) atéque esteja.

Page 21: 01 2 Arvores

21

Remoção

� Efetua-se a busca pelo nó (igual a qualquer outra árvore de busca binária);

� Rotaciona-se até que o mesmo seja um nó-folha e remova-o;� Por quê? A remoção de um nó sem filhos é o caso

mais simples!

� Verifique se a árvore se encontra balanceada, caso não esteja, efetue rotações.

Árvores AVL

� Em árvores binárias ao inserir e remover elementos devemos monitorar a altura das sub árvores.

� Para isso usamos o campo balanço do tipo TNoArvoreBin.

� O balanço de um nó vai ser dado pela diferença da altura da sub árvore direita pela altura da sub árvore esquerda.

Árvores AVL

� Uma árvore AVL deve ter sempre o balanço no intervalo de –1 a 1.

2

4

5

1

3

-1

0

0

0

0

Árvores AVL

� Se, na árvore, for inserido o nó 10 teremos:

2

4

5

1

3

-2

0

0

-1

-1

100

Page 22: 01 2 Arvores

22

Árvores AVL

� A árvore ficará desbalanceada caso um dos nós fique com balanço –2 ou 2.

� Um nó que tinha grau zero não tem a possibilidade de ficar desbalanceado. Dessa forma, o ponto crítico deve ser o nócom balanço diferente de zero.

� O nó mais próximo diferente de zero seráchamado de pivô.

Árvores AVL

20

40

50

10

30

-1

1

0

-1

-1

650

060

57

09

pivô

pivô

Árvores AVL

� Quando inserimos um nó e a árvore fica desbalanceada é necessário fazer algumas transformações na árvore.

� Estas transformações são denominadas de rotações.

Rotação - Definição

� Operação em que a ordem dos nós em uma árvore de busca binária pode ser invertida a fim de manter o balanceamento da mesma;

� Pode ser simples (um único passo, rotacionando à esquerda ou à direita) ou dupla (efetuando mais de uma vez a rotação, em qualquer combinação de rotações simples);

Page 23: 01 2 Arvores

23

Rotação Simples

� Ocorre quando o nó desbalanceado e o seu filho estão no mesmo sentido de inclinação da árvore;

� Formam “uma linha reta”;

Rotação à Esquerda

� Dado um nó X com um filho à direita Y e este tendo um filho à esquerda Z;

� Pseudo-código:Seja Y o filho à direita de X;Torne X o filho à esquerda de Y;Torne o filho à esquerda de Y (Z) o filho à direita de

X;

Árvores AVL

� Rotação simples para a esquerda: ocorre quando o pivô e o filho direito tornam-se mais pesados para a direita.

7

94

-1

1 -1

140

180

7

144

1

0 0

1890 0

Rotação à Direita

� Dado um nó X com um filho à esquerda Y e este tendo um filho à direita Z;

� Pseudo-código:Seja Y o filho à esquerda de X;Torne X o filho à direita de Y;Torne o filho à direita de Y (Z) o filho à esquerda de

X;

Page 24: 01 2 Arvores

24

Árvores AVL

� Rotação simples para a direita: ocorre quando o pivô e o filho esquerdo tornam-se mais pesados para a esquerda.

7

94

1

1 0

20

1

7

92

1

0 0

10

40

Rotação Dupla

� Ocorre quando o nó desbalanceado está em um sentido da inclinação e o seu filho em outro;

� Formam, assim, “um joelho”.

Árvores AVL

� Rotação dupla, uma para a esquerda e outra para a direita: ocorre quando o pivô torna-se “mais pesado” no lado esquerdo e seu filho esquerdo torna-se “mais pesado” do lado direito.

Árvores AVL

1

7

94

1

0

7

92

1

0 0

410 0

0

1

2

7

94

2

2 0

21

10

Page 25: 01 2 Arvores

25

Árvores AVL

� Rotação dupla, uma para a direita e outra para a esquerda: ocorre quando o pivô torna-se “mais pesado” no lado direito e seu filho direito torna-se “mais pesado” do lado esquerdo.

Árvores AVL

0

7

94

-1

-1

140

11

7

94

-2

1 -2

11-1

14

0

7

114

-1

0 0

1490 0

Pesquisa

� O tempo médio para encontrar um elemento em uma árvore AVL é da ordem de O (log n)

� Aproximadamente 1.44 log2 n no pior caso

Exercício Árvore AVL

Page 26: 01 2 Arvores

26

Referências Bibliográficas

� http://www.csi.uottawa.ca/~stan/csi2514/applets/avl/BT.html - Aplicação interessante para compreender árvores AVL

� http://pt.wikipedia.org/wiki/Árvore_AVL

Representação dinâmica

Type

TFilho = (Esquerdo, Direito);

PNoArvoreBin = ^TNoArvoreBin;

TNoArvoreBin = record

PPai : PNoarvoreBin;

Filho : array[Tfilho] of PNoArvoreBin;

Info : TipoInfo;

Balanco : -1..1;

end;

Criação de uma árvore binária

Nó cabeça

Inserção de nós

function Insira(Info :TipoInfo; Pai : PNoArvoreBin;TipoFilho : TFilho) : PNoArvoreBin;

beginif Pai = nil then begin

Pai := NoCabeca;TipoFilho := Esquerdo;

endif Pai^.Filho[TipoFilho] <> nil then

raise Exception.Create(‘Elemento já cadastrado’)else begin

New(result);result^.PPai := pai;result^.filho[esquerdo] := nil;result^.filho[direito] := nil;result^.info := info;result^.balanco := 0;pai^.filho[TipoFilho] := result;

end;end;

Page 27: 01 2 Arvores

27

Remoção de nósprocedure RemovaArBin(No: PNoArvoreBin);

function GetTipoNo(No : PNoArvoreBin) : TFilho;begin

if No^.PPai^.Filho[Esquerdo] = No thenResult := Esquerdo

elseResult := Direito

end

var TipoNo, TipoFilhoNo : TFilho;beginif No <> nil then begin

if No^.Filho[esquerdo] <> nil then beginif No^.Filho[direito] <> nil then

raise Exception.Create(‘Elemento não removido’);

TipoFilhoNo := Esquerdoendelse

TipoFilhoNo := Direito;

Remoção de nós

TipoNo := GetTipoNo(no);No^.PPai^.Filho[TipoNo] := No^.Filho[TipoFilhoNo];

if No^.Filho[TipoFilhoNo] <> nil thenNo^.Filho[TipoFilhoNo]^.PPai := No^.PPai;

Dispose(No);end;

end;

Percursos recursivos

type TVisite = procedure(P : PNoArvoreBin);

// um procedimento visite poderia ser

Procedure Imprimir(P : PNoArvoreBin);

begin

writeln(P^.Info);

end;

procedure PreOrdem(No : PNoArvoreBin; Visite :

TVisite);

begin

if No <> nil then begin

Visite(No);

PreOrdem(No^.Filho[Esquerdo], Visite);

PreOrdem(No^.Filho[Direito], Visite);

end;

end;

Percursos recursivos

procedure InOrdem(No : PNoArvoreBin; Visite : TVisite);

begin

if No <> nil then begin

InOrdem(No^.Filho[Esquerdo], Visite);

Visite(No);

InOrdem(No^.Filho[Direito], Visite);

end;

end;

procedure PosOrdem(No : PNoArvoreBin; Visite :

TVisite);

begin

if No <> nil then begin

PosOrdem(No^.Filho[Esquerdo], Visite);

PosOrdem(No^.Filho[Direito], Visite);

Visite(No);

end;

end;

Page 28: 01 2 Arvores

28

Impressão de uma árvore

procedure Imprima(Raiz : PNoArvoreBin);

procedure PreOrd(raiz : PNoArvoreBin; nivel :

integer);

begin

if Raiz <> nil then begin

writeln('':3*nivel, Raiz^.Info);

PreOrd(Raiz^.Filho[Esquerdo], nivel + 1);

PreOrd(Raiz^.Filho[Direito], nivel + 1);

end

else

writeln('':3*nivel, '---');

end;

begin

PreOrd(Raiz, 0);

end;

Eliminação de todos os nós

procedure Desaloque(raiz : PNoArvoreBin);

begin

if Raiz <> nil then begin

Desaloque(Raiz^.Filho[Esquerdo]);

Desaloque(Raiz^.Filho[Direito]);

Dispose(Raiz);

end;

end;

Número de folhas

function NumFolhas(Raiz : PNoArvoreBin) : integer;

procedure PosOrd(Raiz : PNoArvoreBin);

begin

if raiz <> nil then begin

PosOrdem(Raiz^.Filho[Esquerdo]);

PosOrdem(Raiz^.Filho[Direito]);

if (Raiz^.Filho[Esquerdo] <> nil) and

(Raiz^.Filho[Direito] <> nil) then

inc(result);

end;

end;

begin

result := 0;

PosOrdem(Raiz);

end;

Altura

function Altura(Raiz : PNoArvoreBin) : integer;

procedure InOrdem(Raiz: PNoArvoreBin; nivel:

integer);

begin

if Raiz <> nil then begin

InOrdem(Raiz^.Filho[Esquerdo], Nivel + 1);

if Nivel > Result then

Result := Nivel;

InOrdem(Raiz^.Filho[Direito], Nivel + 1);

end;

end;

begin

Result := 0;

InOrdem(Raiz, 0);

end;