Árvoreswiki.icmc.usp.br/images/9/93/arvoresbinárias_parte2.pdf · pela natureza da árvore...
TRANSCRIPT
![Page 1: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/1.jpg)
Árvores Binárias
9/11 e 11/11
Conceitos
Representação e Implementação
![Page 2: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/2.jpg)
Árvore Binárias (AB)
Uma Árvore Binária (AB) T é um conjunto
finito de elementos, denominados nós ou
vértices, tal que:
(i) Se T = , a árvore é dita vazia, ou
(ii) T contém um nó especial, chamado raiz de T,
e os demais nós podem ser subdivididos em
dois sub-conjuntos distintos TE e TD, os quais também
são árvores binárias.
TE e TD são denominados sub-árvore esquerda e sub-
árvore direita de T, respectivamente
![Page 3: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/3.jpg)
Árvore Binárias (AB) (cont.)
A raiz da sub-árvore esquerda (direita) de um nó v,
se existir, é denominada filho esquerdo (direito) de
v. Pela natureza da árvore binária, o filho esquerdo
pode existir sem o direito, e vice-versa
Se r é a raiz de T, diz-se que TEr e TDr são as sub-
árvores esquerda e direita de T, respectivamente
Árvore Binária é uma árvore ordenada de grau 2.
![Page 4: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/4.jpg)
Exemplos de Árvore Binárias (AB)
A
B
G
C
ED F
IH
![Page 5: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/5.jpg)
Exemplos de Árvores Binárias
![Page 6: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/6.jpg)
Eficiência para as operações
Árvores binárias podem ser usadas para guardar e recuperar informações, com número de operações proporcional à altura da árvore, ou seja, variando, aproximadamente, entre log2 n
e n (quando se torna degenerada para uma lista).
Mais tarde veremos como esta manipulação pode ser realizada de maneira a garantir a altura da ordem de O(log2 n)
![Page 7: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/7.jpg)
Tipos de AB
Árvore Estritamente Binária
Árvore Binária Completa
Há duas definições: (i) completa = cheia e (ii) completa = a
definição de quase completa, dada abaixo
Árvore Binária Quase Completa
Árvore Binária Balanceada (altura difere max 1)
Árvore Binária Perfeitamente Balanceada (número
de nós difere max 1)
![Page 8: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/8.jpg)
Árvore Estritamente Binária
Uma Árvore
Estritamente Binária
tem nós que têm ou 0
(nenhum) ou dois filhos
Nós internos (não
folhas) sempre têm 2
filhos
A
B G
C
E F
D
![Page 9: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/9.jpg)
Árvore Binária Completa (Cheia)
Árvore Binária Completa (Cheia) (ABC)
é estritamente binária, de nível d; e
todos os seus nós-folha estão no mesmo
nível (d)A
B G
C E FD
C,D,E,F estão nonível 3
(altura = 3)
![Page 10: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/10.jpg)
Árvore Binária Completa (Cheia)
Dada uma ABC e sua altura, pode-se
calcular o número total de nós na árvore
p.ex., uma ABC com altura 3 tem 7 nós
Nível 1: => 1 nó
Nível 2: => 2 nós
Nível 3: => 4 nós
No. Total de nós = 1 + 2 + 4 = 7
Verifique que: se uma ABC tem altura h, então o
número de nós da árvore é dado por:
N = 2h - 1
![Page 11: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/11.jpg)
.......
.......
1
2
3
h
1 = 20
2 = 21
4 = 22
2h-1
Número de nós por nívelNível
N = 2i = 2h - 1i=0
h-1
![Page 12: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/12.jpg)
Árvore Completa (Cheia) de grau d e altura h
.......
.......
1
2
3
h
1
d
d2
dh-1
Número de nós por nívelNível
.......
N(h) = di = dh - 1i=0
h-1
d - 1, d > 1
![Page 13: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/13.jpg)
13/40
Inversamente:
Se N é o número de nós de uma ABC, de
grau d, qual é a altura h da árvore?
N(h) = dh - 1
d - 1
h = logd(N.d – N + 1)
para d=2: h = log2(N + 1)
![Page 14: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/14.jpg)
14/40
Árvore Binária Quase Completa
Árvore Binária Quase Completa
Se a altura da árvore é d, cada nó folha está no
nível d ou no nível d-1.
Em outras palavras, a diferença de altura entre as
sub-árvores de qualquer nó é no máximo 1.
![Page 15: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/15.jpg)
15/40
Implicações dos conceitos completa
(cheia) e quase completaImportante para:
sua alocação em vetores, pois quando é cheia não desperdiça espaço, e
na definição do método de ordenação heapsort que trabalha com o conceito de árvore completa como se fosse nossa definição de quase completa.
Neste método a árvore (heap) é preenchida da esquerda para direita.
Uma árvore completa é aquela em que se n é um nó com algumas de subárvores vazias, então n se localiza no penúltimo ou no último nível.
![Page 16: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/16.jpg)
16/40
Árvore Binária Balanceada
Árvore Binária Balanceada
para cada nó, as alturas de suas duas sub-
árvores diferem de, no máximo, 1
A
B C
D E
A
B C
FED
![Page 17: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/17.jpg)
17/40
Árvore Binária Perfeitamente
Balanceada
Árvore Binária Perfeitamente Balanceada: para
cada nó, o número de nós de suas sub-árvores
esquerda e direita difere em, no máximo, 1
Toda AB Perfeitamente Balanceada é Balanceada,
mas o inverso não é necessariamente verdade.
Uma AB com N nós tem altura mínima se e só se
for Perfeitamente Balanceada.
![Page 18: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/18.jpg)
18/40
Exemplo
A
B C
D E
A
B C
FED
Árvore Balanceada Árvore Perfeitamente Balanceada
6 nós: hmin = 3
![Page 19: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/19.jpg)
19/40
Árvores Perfeitamente Balanceadas
de Grau 2
![Page 20: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/20.jpg)
Questões
Qual a altura máxima de uma AB com n nós?
Resposta: n
Árvore degenerada Lista
20/40
12
n
Há outra forma
para esta
árvore?
![Page 21: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/21.jpg)
21/40
Questões
Qual a altura mínima de uma AB c/ n nós?
Resposta: a mesma de uma AB Perfeitamente Balanceada
com N nós
1
2 3
5 6 74
8
N=1; h=1
N=2,3; h=2
N=4..7; h=3
N=8..15; h=4
hmin= log2N+1(maior inteiro log2N) + 1
ou
hmin = log2(N+1)menor inteiro log2(N+1)
![Page 22: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/22.jpg)
22/40
Árvores de Altura Mínima
![Page 23: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/23.jpg)
Questões
Uma árvore binária completa é uma árvore
estritamente binária?
Uma árvore estritamente binária é uma
árvore binária completa?
23/40
![Page 24: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/24.jpg)
24/40
Implicações dos conceitos de balanceada e
perfeitamente balanceada
Estas árvores permitem que a recuperação
de informação possa ser realizada de
maneira a garantir a altura da ordem de
O(log2 n) e
assim a eficiência em termos de tempo.
![Page 25: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/25.jpg)
25/40
Representação/Implementação
Estática Seqüêncial
Simples,
Melhor solução quando é completa (cheia). Se
não for completa (cheia), um campo “usado” é
necessário para indicar qual posição tem ou não
elemento.
Encadeada Dinâmica
O limite para o número de nós é a memória
Preferida no caso geral
![Page 26: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/26.jpg)
Árvores binárias
Representação estática e seqüencial de árvores binárias
Vetor
Como colocar a árvore abaixo nesse vetor?
0 6
![Page 27: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/27.jpg)
Árvores binárias
Representação estática e seqüencial de árvores binárias
Vetor
Como colocar a árvore abaixo nesse vetor?
C B A
0 6
![Page 28: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/28.jpg)
Árvores binárias
Representação estática e seqüencial de árvores binárias
Vetor
Como colocar a árvore abaixo nesse vetor?
C B A G D
0 6
![Page 29: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/29.jpg)
Árvores binárias
Representação estática e seqüencial de árvores binárias
Vetor
Como colocar a árvore abaixo nesse vetor?
C B A G D F E
0 6
![Page 30: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/30.jpg)
Árvores binárias
Representação estática e seqüencial de árvores binárias
Como saber quem é filho de quem?
C B A G D F E
0 6
![Page 31: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/31.jpg)
Árvores binárias
Representação estática e seqüencial de árvores binárias
Como saber quem é filho de quem?
Filhos de i são 2i+1 e 2i+2
C B A G D F E
0 6
![Page 32: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/32.jpg)
AB Completa (Cheia) (estática, seqüencial)
Vantagem: espaço só p/ armazenar conteúdo; ligações implícitas
Desvantagem: espaços vagos se árvore não é completa por níveis, ou se sofrer eliminação
32/40
![Page 33: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/33.jpg)
33/40
ED AB, seqüencial estática
#define NUMNODES 500
typedef int elem;
struct arv {
elem info;
int used;
}
typedef struct arv Arv[NUMNODES];
![Page 34: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/34.jpg)
34/40
Criar uma árvore com nó raiz
void criar(elem x, Arv t[ ])
{
Int p;
t[0].info = x;
t[0].used = 1;
For (p=1; p<NUMNODES;p++)
t[p].used = 0;
}
// para criar a árvore vazia é só setar FALSE no campo used de 0.. NUMNODES
![Page 35: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/35.jpg)
35/40
ED AB, encadeada dinâmica
Para qualquer árvore, cada nó é do tipo
dir
info
esq
a
b c
e
g
a
b c
e
g
RAIZtypedef int elem;
typedef struct arv *Arv;
struct arv {
elem info;
struct arv* esq;
struct arv* dir;
};
AB.h
AB.c
![Page 36: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/36.jpg)
36/40
Árvore binária Operações do TAD
1. Criação de uma árvoreDois casos: seguindo a definição recursiva
1. Criar uma árvore vazia
2. Criar uma árvore com 2 subárvores (e,d): faz o papel de inserir nó
2. Verificar se árvore está vazia, mostrar o conteúdo do nó
3. Buscar o pai de um nó, buscar um nó
4. Retornar: nro de nós, nro de folhas, altura
5. Destruir árvore
6. Remover um nóDois casos:
1. O nó não tem filhos
2. O nó tem um filho a esq, ou a dir ou os dois
7. Verificar nível de um nó
8. Verificar se é balanceada, se é perfeitamente balanceada
Outras?
![Page 37: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/37.jpg)
Operações com resolução similar: usam percursos
Operações do TAD1. Criação de uma árvoreDois casos: seguindo a definição recursiva
1. Criar uma árvore vazia
2. Criar uma árvore com 2 subárvores (e,d): faz o papel de inserir nó
2. Verificar se árvore está vazia, mostrar o conteúdo do nó
3. Buscar o pai de um nó, buscar um nó
4. Retornar: nro de nós, nro de folhas, altura
5. Destruir árvore
6. Remover um nóDois casos:
1. O nó não tem filhos
2. O nó tem um filho a esq, ou a dir ou os dois
7. Verificar nível de um nó
8. Verificar se é balanceada, se é perfeitamente balanceada
Imprime
![Page 38: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/38.jpg)
Interface para as funções do TAD (sem pensar em erros). Insiram tratamento de erros quando tiverem implementando o TAD.
typedef int elem;
// Tipo exportado
typedef struct arv *Arv;
// Cria uma árvore vazia
Arv arv_criavazia (void);
// Cria uma árvore com uma raiz e duas subárvores
Arv arv_cria (elem c, Arv e, Arv d);
//Libera toda a memória usada na árvore a
Arv arv_destroi (Arv a);
// Imprime a lista a
void arv_imprime (Arv a); 38/40
![Page 39: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/39.jpg)
// Verifica se a árvore a é vazia
int arv_vazia (Arv a);
// Retorna o conteúdo de um nó x na árvore a
elem arv_mostra_no(Arv a, int *erro);
//Retorna (busca) o endereço de c na árvore a. Se c não está,
retorna NULL
Arv arv_busca (Arv a, elem c);
// Retorna (busca) o endereço do pai de x na árvore a
Arv arv_busca_pai(Arv a, elem x);
//Remove um elemento da árvore, caso ele esteja nela. Retorna
erro = 0 se sucesso e erro = 1 se não encontra
void arv_remove(Arv a, elem x, int *erro);
39/40
![Page 40: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/40.jpg)
//Retorna a altura de uma árvore binária a. Considera o nível da raiz = 1
int arv_altura(Arv a);
// Retorna o número de nós na árvore a
int arv_numero_nos(Arv a);
//Retorna o número de folhas da árvore a
int arv_nro_folhas(Arv a);
//função de percurso de pre-ordem na árvore = busca em profundidade
void arv_percurso_pre_ordem(Arv a);
//função de percurso de em-ordem na árvore
void arv_percurso_em_ordem(Arv a);
//função de percurso de pos-ordem na árvore
void arv_percurso_pos_ordem(Arv a);40/40
![Page 41: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/41.jpg)
41/40
AB - Percursos Objetivo: Percorrer uma AB „visitando‟ cada nó uma
única vez.
Um percurso gera uma seqüência linear de nós, e
podemos então falar de nó predecessor ou sucessor
de um nó, segundo um dado percurso.
Não existe um percurso único para árvores (binárias ou
não): diferentes percursos podem ser realizados,
dependendo da aplicação.
Utilização: imprimir uma árvore, atualizar um campo
de cada nó, buscar um item, destruir uma árvore, etc.
![Page 42: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/42.jpg)
42/40
AB – Percursos em Árvores
3 percursos básicos para AB's:
pré-ordem (Pre-order)
in-ordem (In-order)
pós-ordem (Post-order)
A diferença entre eles está, basicamente, na ordem
em que cada nó é alcançado pelo percurso
“Visitar” um nó pode ser:
Mostrar (imprimir) o seu valor;
Modificar o valor do nó;
Verificar se o valor pertence a árvore (membro)
![Page 43: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/43.jpg)
43/40
Pré-ordemse árvore vazia; fim
1. visitar o nó raiz
2. percorrer em pré-ordem a subárvore esquerda
3. percorrer em pré-ordem a subárvore direita
![Page 44: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/44.jpg)
44/40
AB - Percurso Pré-Ordem
void arv_percurso_pre_ordem(Arv a) {
if (!arv_vazia(a)) {
printf("%d\n",a->info); // processa raiz
arv_percurso_pre_ordem(a->esq);
arv_percurso_pre_ordem(a->dir);
}
}
Resultado: ABDGCEHIF
D F
G
A
B C
H I
E
![Page 45: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/45.jpg)
45/40
E se invertermos as chamadas recursivas?
Trocar
pre_ordem(a->esq);
pre_ordem(a->dir);
POR:
pre_ordem(a->dir);
pre_ordem(a->esq);
Ainda é pré-ordem??
![Page 46: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/46.jpg)
46/40
In-Ordemse árvore vazia, fim
1. percorrer em in-ordem a subárvore esquerda
2. visitar o nó raiz
3. percorrer em in-ordem a subárvore direita
![Page 47: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/47.jpg)
47/40
AB - Percurso In-Ordem
Resultado: DGBAHEICF
D F
G
A
B C
H I
E
void arv_percurso_em_ordem(Arv a) {
if (!arv_vazia(a)) {
arv_percurso_em_ordem(a->esq);
printf("%d\n",a->info); // processa raiz
arv_percurso_em_ordem(a->dir);
}
}
![Page 48: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/48.jpg)
48/40
E se invertermos as chamadas recursivas?
Ainda é in-ordem? Qual o resultado para a árvore abaixo?
I
O I
U H
N
DV
A
![Page 49: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/49.jpg)
49/40
Pós-ordem
se árvore vazia, fim
1. percorrer em Pós-Ordem a subárvore esquerda
2. percorrer em Pós-Ordem a subárvore direita
3. visitar o nó raiz
![Page 50: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/50.jpg)
50/40
AB - Percurso Pós-Ordem
Resultado: GDBHIEFCA
D F
G
A
B C
H I
E
void arv_percurso_pos_ordem(Arv a) {
if (!arv_vazia(a)) {
arv_percurso_pos_ordem(a->esq);
arv_percurso_pos_ordem(a->dir);
printf("%d\n",a->info); //processa raiz
}
}
![Page 51: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/51.jpg)
E se invertermos as chamadas recursivas?
Ainda é pós-ordem?
![Page 52: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/52.jpg)
Procedimento recursivo p/ destruir árvore,
liberando o espaço alocado
Usar percurso em pós-ordem
Arv arv_destroi (Arv a)
![Page 53: Árvoreswiki.icmc.usp.br/images/9/93/ArvoresBinárias_Parte2.pdf · Pela natureza da árvore binária, o filho esquerdo pode existir sem o direito, e vice-versa](https://reader031.vdocuments.pub/reader031/viewer/2022022108/5c000e0d09d3f20e6b8c429b/html5/thumbnails/53.jpg)
Procedimento recursivo p/ destruir árvore,
liberando o espaço alocado (percurso em pós-
ordem)
Porque não usamos pré ou in-ordem para esta tarefa???
Arv arv_destroi (Arv a) {
if (!arv_vazia(a)) {
arv_destroi(a->esq); /* libera sae */
arv_destroi(a->dir); /* libera sad */
free(a); /* libera raiz */
}
return NULL;
}