01 2 arvores
DESCRIPTION
Estruturas de dados, ÁrvoresTRANSCRIPT
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.
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
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).
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:
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
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)
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
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;
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;
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ê?
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
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
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;
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.
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
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.
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;
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.
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;
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.
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
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);
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;
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
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
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;
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;
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;