Sie sind auf Seite 1von 21

Árvores binárias

• Nó raíz
a • Nós folhas
• Subárvores
b c
• Esquerda
d e f • Direita

• Profundidade do nó
g h i j k
• e tem profundidade 2
l
• Profundidade da árvore
• 4

1
Percursos em Árvores Binárias

• A busca nada mais é do que um percurso em uma


árvore
• O percurso em uma árvore visitando cada nó uma
única vez gera uma seqüência linear de nós
• Há três maneiras recursivas de se percorrer árvores
binárias:
• Percurso em pré-ordem (RED)
• Percurso em pós-ordem (EDR)
• Percurso em ordem (ERD) - central
Percurso em Pré-Ordem (RED)

• Algoritmo básico:
1. visitar o nó raiz
2. sub-árvore esquerda

3. sub-árvore direita

ABDCEGFHI
Percurso em Em Ordem

• Algoritmo básico:
1. sub-árvore esquerda
2. visitar o nó raiz

3. sub-árvore direita

DBAEGCHFI
Percurso em Pós-Ordem

• Algoritmo básico:
1. sub-árvore esquerda

2. sub-árvore direita
3. visitar o nó raiz

DBGEHIFCA
Exercício

• Construa uma função que imprima uma árvore lateralmente


na tela.

500 900
800
600
300 800 500
400
300
150 400 600 900 150

6
Exercício

• Construa uma função que imprime uma árvore lateralmente


na tela
void imprime(TTree *pai, int nivel){
int i;
if (pai == NULL)
return;
imprime(pai->dir,nivel+1);
for(i= 0; i < nivel; ++i)
printf(" ");
printf("%d\n", pai->dado);
imprime(pai->esq,nivel+1);

}
7
Árvores binárias de pesquisa (ABP)

• Relação de ordem entre os nodos

> 500 <

300 > 800 <

150 400 600 900

8
Operações sobre ABP

• Pesquisar – buscar nodo


• Inserir novo nodo
• Remover nodo

500

300 800

150 400 600 900

9
Pesquisar nodo

• Buscar o nodo com a chave x


• Em qualquer nodo da árvore
•x = Chave

•x > Chave

•x < Chave 500

300 800

150 400 600 900

10
Inserir nodo

• Se a árvore for vazia, insere o novo nodo como raiz


• Se não for vazia, compara a chave do novo nodo
com a chave do nodo raiz
• Se for menor, insere na sub-árvore da esquerda
• Caso contrário, insere na sub-árvore da direita

500
400 800 300 500

300 800

Sempre como um nodo folha 400

11
Inserção

• A árvore gerada depende da ordem de inserção dos


nodos

350 – 300 – 400 – 150 – 450 – 375 – 300 – 150 – 400 – 350 – 450 – 320 –
320 375

350 300

300 400 150 400

150 320 375 450 350 450

320 375

Qual a melhor configuração para uma ABP ?

12
Árvores binárias balanceadas

• Um árvore binária está balanceada se em todos


níves acima do mais baixo estão completos
(contêm 2 nós)
Árvore Não-Balanceada
Árvore Balanceada

300
350

150 400
300 400

350 450
150 320 375 450

320 375
380

380
13
Inserção ordenada em ABP

0 1 2 3 4 5 6
2 3 5 7 11 13 17

3 13

2 5 11 17

14
Exclusão de um nodo

• Três casos
Caso 1 - Nodo é folha
Nodo não é folha:
Caso 2 - Nodo possui apenas uma sub-árvore
Caso 3 - Nodo possui duas sub-árvores

300 300 300

150 400 150 400 150 400

350 350 350 450

320 375 320 375


15
Exclusão de um nodo

Caso 1 - Nodo é folha


- Simplesmente remove-se o nodo

300 300

150 400 150 400

350

16
Exclusão de um nodo

Caso 2 - Nodo possui apenas uma sub-árvore


- Raiz da sub-árvore passa a ocupar o lugar do nodo
excluído

300 300

150 400 150 350

350 320 375

320 375

17
Exclusão de um nodo

Caso 3 - Nodo possui duas sub-árvore


- Trocar o valor do nodo a ser removido com
- o valor do nodo que tenha o maior valor da sua sub-
árvore da esquerda
OU
- o valor do nodo que tenha o menor valor da sua sub-
árvore da direita
- Buscar a sub-árvore onde foi feita a troca (esquerda ou
direita) e remover o nodo

18
Exclusão de um nodo

Caso 3 - Nodo possui duas sub-árvore

300 300

150 400 150 375

350 450 350 450

320 375 320

19
Exercício

• Crie uma função que remove um nodo de uma


árvore binária de pesquisa.
• Sugestão de protótipo para uma função recursiva

remove(TipoArvore raiz, int chave)

raiz da árvore Valor do nodo a ser


removido

• As funções auxiliares maior e move podem ser úteis


(próximo slide)

20
Exclusão – funções auxiliares

// Copia o conteúdo do nodo r para o pai e libera r


void move(TipoArvore *pai, TipoArvore *r){
pai->esq = r->esq;
pai->dir = r->dir;
pai->dado = r->dado;
free(r);
}

int maior(TipoArvore *r){


while (r->dir != NULL)
r = r->dir;
return r->dado;
}

21

Das könnte Ihnen auch gefallen