Você está na página 1de 39

EMB 5903

Modelagem e Programao de Sistemas

Aula 13 rvores
Parte 1

Pablo Andretta Jaskowiak


Sumrio

Motivao
Busca em vetores e busca binria

rvores
rvores Binrias

rvores Binrias de Busca


Implementao com ponteiros
Algoritmos iterativos e recursivos
Motivao

Os TADs que vimos at agora so lineares

TAD Lista
Implementao com ponteiros
Eficiente para insero e remoo
Ineficiente para busca
Implementao com vetor
Ineficiente para insero e remoo
Eficiente para busca, caso a lista seja ordenada
Busca de elemento

Consideremos um vetor ordenado


Como podemos buscar um elemento?
Podemos comear do incio e percorrer o vetor at o fim
Busca de elemento

Consideremos um vetor ordenado


Como podemos buscar um elemento?
Podemos comear do incio e percorrer o vetor at o fim

Podemos percorrer o vetor at achar um elemento maior


Busca de elemento

Consideremos um vetor ordenado


Como podemos buscar um elemento?
Podemos comear do incio e percorrer o vetor at o fim

Podemos percorrer o vetor at achar um elemento maior

Podemos analisar sempre o elemento do meio


Se o elemento buscado for igual ao do meio, achamos!
Se o elemento buscado for maior, est na parte direita
Se o elemento buscado for menor, est na parte esquerda
Busca de elemento
Busca binria

Considerando um vetor ordenado


Busca de elemento
Busca binria

Considerando um vetor ordenado


Implementar a verso recursiva!
Busca de elemento
Busca binria

Considerando um vetor ordenado


Implementar a verso recursiva!
Motivao

Os TADs que vimos at agora so lineares


Mesmo usando busca binria
TAD Lista
Implementao com ponteiros
Eficiente para insero e remoo
Ineficiente para busca
Implementao com vetor
Ineficiente para insero e remoo
Eficiente para busca, caso a lista seja ordenada
Motivao

Uma possvel soluo para o problema


Utilizar estrutura de dados no linear
Tipo Abstrato de Dados rvore (TAD rvore)
rvore Binria de Busca
Eficiente para insero, remoo e busca

Vamos estudar implementao com ponteiros


rvores

Qual a rvore correspondente de C:?


rvores

So um Tipo Abstrato de Dados (TAD)


No linear
Possuem estrutura hierrquica
Temos ns e relaes de parentesco
Um n pode ser pai de outros ns
Um n pode ser filho de um n

Diversas aplicaes prticas


Estrutura de arquivos, modelos de classificao, deciso, ...
rvores
Definies

Definimos uma rvore T como um conjunto finito


de elementos, denominados ns, nodos ou vrtices

Uma rvore pode ser vazia, neste caso no h ns


rvores
Definies
RT

T1 T2 ... Tn
Caso a rvore no seja vazia
T possui um n especial, chamado raiz RT
Os demais ns, ou constituem um nico conjunto vazio,
ou so divididos em n conjuntos disjuntos no vazios T1,
T2, , Tn que so, cada uma rvore
Note que a definio recursiva
T1, T2, , Tn so chamadas subrvores de RT
rvores
Definies

Se um n Y raiz de uma subrvore de um n X


Dizemos que X pai de Y
Dizemos que Y filho de X

Dois ns so irmos se so filhos do mesmo pai

Se os ns Y1, Y2, , Yj so irmos e o n Z


filho de Y1, ento Y2, , Yj so tios de Z
rvores
Definies

Ns: A, B, C, D, E, F, G
Raiz da rvore

Filhos de A
B C D
Filho de D

Filhos de B
E F G
rvores
Definies

Raiz: n da rvore que no possui pai


N interno: n da rvore com pelo menos um filho
N folha: n da rvore sem filhos
Ancestrais (de um n): pai ou ancestrais do pai do n
Descendentes (de um n): ns que o possuem como ancestral
Subrvore: rvore consistindo de um n e seus descendentes
rvores
Definies

O nvel de um n x na rvore definido como


Se x a raiz da rvore, seu nvel igual a 1
O nvel de um n x no raiz dado por
Nvel do seu n pai + 1

O grau de um n x que pertence uma rvore igual ao


seu nmero de filhos. Se x folha, ento seu grau 0

O grau de uma rvore T o maior dentre os graus de


todos os ns da rvore
rvores
Definies

Profundidade de um n
Corresponde ao seu nmero de ancestrais
Profundidade de uma rvore
Mxima profundidade de uma folha
Altura de um n
Altura da subrvore com raiz naquele n
Altura de uma rvore
Mxima profundidade de qualquer um de seus ns
rvores

A
ALTURA DE A: 4
ALTURA DE C:
ALTURA DE D:
0
1
B C D E
PROF. DE A: 0
PROF. DE C: 1 F G H I J K L
PROF. DE D: 1

M N O

P
Altura rvore = Profundidade rvore = 4
rvores Binrias

Vamos estudar o tipo mais bsico de rvore


rvore binria

Uma rvore Binria T um conjunto finito de


elementos, denominados ns, nodos ou vrtices

Uma rvore Binria pode ser vazia


rvores Binrias

Em uma rvore Binria T no vazia


Existe um n especial, chamado raiz de T (RT)

Os demais ns podem ser divididos em dois conjuntos


Subrvore esquerda da raiz (TE)
Subrvore direita da raiz (TD)
Estes subconjuntos tambm so rvores binrias
As quais podem ou no ser vazias
rvores Binrias

Se uma rvore Binria contm n ns


Sua altura mxima n-1
Nesse caso a rvore dita degenerada
Sua altura mnima Teto[log2(n+1)] - 1
n=1 h=0
1
n = 2, 3 h=1
2
n = 4, ..., 7 h=2
3
n = 8, ..., 15 h=3
...
4 5 6 7
n = 2h+1 1 h = log2(n+1) 1
rvores Binrias

rvore estritamente binria


Cada n interno possui exatamente dois filhos

B C

D E F G

H I
rvores Binrias

rvore binria completa


uma rvore estritamente binria
Se a profundidade da rvore d
Cada folha est no nvel d ou d+1

nvel d

nvel d+1
rvores Binrias

rvore binria completa cheia


uma rvore binria completa
Todos ns folha esto no mesmo nvel
A

B G

C D E F
rvores Binrias

O TAD rvore Binria armazena itens


Podemos realizar operaes no TAD
Criar rvore
Destruir rvore
Inserir na esquerda de um n
Inserir na direta de um n

Vamos implementar algumas operaes
rvores Binrias

Estruturas
rvores Binrias

Operaes
ArvoreBinaria<tipo>* inicializaArvore()

Cria uma rvore binria vazia e retorna seu ponteiro


rvores Binrias

Operaes
void imprimeArvore(ArvoreBinaria<tipo>* a)
No<tipo>* insereDireita(ArvoreBinaria<tipo>* a, No<tipo>* noPai, tipo elemento)
No<tipo>* insereEsquerda(ArvoreBinaria<tipo>* a, No<tipo>* noPai, tipo elemento)
bool folha(No<tipo>* no)
bool removeEsquerda(No<tipo>* no)
bool removeDireita(No<tipo>* no)
bool removeNo(ArvoreBinaria<tipo>* a, No<tipo>* no)
void destroiArvore(ArvoreBinaria<tipo>* a)
int alturaArvore(No<tipo>* no)
int alturaNo(No<tipo>* no)
rvores Binrias

Operaes
int profundidadeNo(No<tipo>* no)
int profundidadeArvore(No<tipo>* no)
int numeroDeNosArvore(No<tipo>* no)
int numeroDeFolhasArvore(No<tipo>* no)
No<tipo>* filhoEsquerdo(No<tipo>* no)
No<tipo>* filhoDireito(No<tipo>* no)
void imprimeCaminhos(ArvoreBinaria<tipo>* a)
No<tipo>* encontraElemento(ArvoreBinaria<tipo>* a, tipo elemento)
void caminhoPreOrdem(No<tipo>* no)
void caminhoEmOrdem(No<tipo>* no)
void caminhoPosOrdem(No<tipo>* no)
rvores Binrias

Percursos ou caminhos em rvores binrias


Objetivo
Percorrer a rvore uma nica vez

Gera uma sequncia linear de ns

Utilizao
Imprimir a rvore, buscar elemento, destruir, ...
rvores Binrias

Percursos ou caminhos em rvores binrias


Pr-Ordem
O n visitado/processado antes dos seus descendentes
Em-Ordem
O n visitado/processado
Depois da sua subrvore esquerda
Antes da sua subrvore direita
Ps-Ordem
O n visitado/processado depois de seus descendentes
rvores Binrias

Percurso Pr-Ordem
Se a rvore for vazia, fim
Seno
Visitar o n
Percorrer em pr-ordem a subrvore esquerda
Percorrer em pr-ordem a subrvore direita
rvores Binrias

Percurso Em-Ordem
Se a rvore for vazia, fim
Seno
Percorrer em-ordem a subrvore esquerda
Visitar o n
Percorrer em-ordem a subrvore direita
rvores Binrias

Percurso Ps-Ordem
Se a rvore for vazia, fim
Seno
Percorrer em ps-ordem a subrvore esquerda
Percorrer em ps-ordem a subrvore direita
Visitar o n
rvores Binrias

Exerccios
Terminar de implementar as operaes dos slides
Cdigo com as declaraes no Moodle
Possui comentrios explicando o que deve ser implementado

Insira e remova elementos

Como ficam os percursos pre/em/pos-ordem das arvores


rvores Binrias

rvores Binrias de Busca


Prximas aulas

Você também pode gostar