Download - 01 2 Arvores

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;


Top Related