operações em Árvores binárias
TRANSCRIPT
1
Visite(p) conteúdo do nó apontado por p
Esquerda(p) ponteiro para o filho da esquerda de p
Direita(p) ponteiro para o filho da direita de p
Pai(p) ponteiro para o pai de p
Irmão(p) ponteiro para o irmão de p
eh_esq(p) Retorna true se p é filho da esquerda e false, se filho da direita
eh_dir(p) Retorna true se p é filho da esquerda e false, se filho da direita
Operações em Árvores Binárias
2
Operações em Árvores Binárias
p = cria(x) Cria uma AB com apenas um nó com conteúdo x. Retorna o ponteiro para a nova árvore.
resp = filho_esq(p,x) Cria um filho à esquerda do nó apontado por p, com conteúdo x.
Retorna false caso já exista um filho esquerdo e true caso contário.
resp = filho_dir (p,x) Cria um filho à direita do nó apontado por p, com conteúdo x.
Retorna false caso já exista um filho direito e true caso contário.
3
Aplicações Com Árvores Binárias É uma estrutura útil quando uma de duas
decisões devem ser tomadas no decorrer do processo. Encontrar todas as duplicatas em uma lista
de números Um forma de fazer isso é comparar o número
como todos os que o precedem isto não é uma solução eficiente
4
Aplicações Com Árvores Binárias Solução: empregar uma árvore binária
Armazenam-se os números na árvore de forma a: o 1º número é armazenado na raiz de uma árvore com
apenas um nó interno cada um dos próximos números na lista é comparado com a
raiz: caso seja igual é uma duplicata caso seja menor, é armazenado na sub-árvore da direita
seguindo-se recursivamente o mesmo procedimento caso seja maior, é armazenado na sub-árvore da esquerda
seguindo-se recursivamente o mesmo procedimento
5
Aplicações Com Árvores Binárias14, 18, 4, 9, 7, 15, 3, 5, 17, 4, 20, 9, 5
3
5
7
9
4
17
15 20
18
14
6
Aplicações com Árvores Binárias outra aplicação comum é atravessar a árvore
binária, visitando cada nó como sistematicamente visitaremos cada nó?
operação é trivial para listas lineares
para árvores, existem diferentes formas de proceder os métodos diferem conforme a ordem em que se
visitam os nós, o problema sendo resolvido
7
Atravessando Árvores Binárias Métodos
pré-ordem:visite a raiz, então visite a subárvore da esquerda, depois a subárvore da direita
em-ordem ou ordem simétrica: visite a subárvore da esquerda, então visite a raiz, depois a subárvore da direita
pós-ordem: visite a subárvore da esquerda, então visite a subárvore da direita, depois a raiz
8
pré-ordem: - * a b * + f g e
em-ordem: a*b - f+g * e
pós-ordem: a b * f g + e * -
Atravessando Árvores Binárias a * b + d - ( f + g ) * e
a b
*
f g
+ e
*
-
9
Atravessando Árvores Binárias
implementação simples dos métodos - recursiva como se visita uma subárvore de cada vez,
seguindo-se a regra recursiva , cada subárvore é visitada começando pela raiz
10
Pré-ordem
pre_ordem (pt){
if (pt == NULL) return ();visite(raiz);pre_ordem (pt->esq);pre_ordem (pt-> dir);
}
11
em-ordem
em_ordem (pt){
if (pt == NULL) return ();em_ordem (pt->esq);visite(raiz);em_ordem (pt-> dir);
}
12
Pós-ordem
pos_ordem (pt){
if (pt == NULL) return ();pos_ordem (pt->esq);pos_ordem (pt-> dir);visite(raiz);
}
13
Árvore Binária Completa representação em lista sequencial
cada nó pode receber um número de 1 a N um nó de número i está na posição i da lista seus filhos da esquerda e da direita nas posições 2i+1
e 2i+2, respectivamente
⇒ não necessita ponteiros⇒ restringe um tamanho para a árvore⇒ também chamada de representação seqüencial
14
H( 8 )
I( 9 )
D( 4 )
E( 5 )
B( 2 )
F( 6 )
G( 7 )
C( 3 )
A( 1 )
A B C D E F G H I
Árvore Binária quase Completa
15
Exercícios implementar os procedimentos pré-
ordem, em-ordem e pós-ordem de forma não recursiva
calcular a altura de cada nó de uma árvore binária (exercício do livro texto)
16
em-ordemp = raiz;do { /* segue pelo ramo da esq. até NULL */ while (p != NULL) {
push(p); p=p->esq;
} /* verifica se já processou toda árvore */ if (pilha_não_vazia()){ p = pop(); visite(p); p = p->dir;
} } while(pilha_não_vazia() || p != NULL);}
H I
D E
B C
A
17
Árvore Binária de Busca
18
Árvore Binária de Busca
construída de tal forma que, para cada nó: nós com chaves menores estão na sub-árvore
esquerda nós com chaves maiores (ou iguais) estão na
sub-árvore direita
a inserção dos nós da árvore deve satisfazer a essa propriedade
19
Árvore Binária de Busca para a busca de uma chave v na árvore binária
de busca: primeiro compare com a raiz
se menor, vá para a sub- árvore esquerda se maior, para a sub-árvore direita
aplique o método recursivamente
20
Árvore Binária de Busca
2
3 5
4
6 9
8
6
21
Árvore Binária de Busca a cada passo, garante-se que nenhuma outra
parte da árvore contém a chave sendo buscada
o procedimento pára quando o nó com v é encontrado senão, chega-se a NULL
22
Árvore Binária de Buscabusca_arvore_nao_recursivo (v, pt){
do { if (v < pt->info)
pt = pt-> esq; else pt = pt-> dir; }while (pt != NULL) && (v != pt->info);
return(pt);}
23
Inserindo em Árvore Binária de Busca
Para inserir um nó na árvore: fazer uma busca com insucesso alocar um novo nó é necessário saber por qual nó se chegou a NULL
será o pai do novo nó
24
Inserindo em Árvore Binária de Busca
2
3 5
4
6 9
8
6
25
Inserindo em Árvore Binária de Busca
2
3 5
4
7
6 9
8
6
26
Inserção Árvore Binária de Buscainsere_árvore (int valor, tipo_nó * pt){ tipo_nó * pai; do{ pai = pt ;
if (valor < pt->chave) pt = pt ->esq ; else pt = pt->esq;
} while(pt != NULL);if (pt == NULL){
pt = aloca();pt ->chave = valor; pt->esq = NULL; pt->dir = NULL;if (v < pai->chave) pai ->esq = pt ;else pai ->dir = pt ;return(pt);
}}
27
Inserção Árvore Binária de Busca a árvore está classificada se percorrida da
forma correta (pre, pos ou em-ordem?) as chaves aparecem em ordem se lidas da
esquerda para a direita podemos ordenar uma sequência como se
fosse uma série de inserções o programa tem apenas os ponteiros para se
preocupar qual a diferença
28
Remoção em Árvore Binária de Busca até então, vimos que a implementação da
operação de inserção é simples a remoção de um elemento já é mais complexa
remoção de um nó folha os ponteiros esquerdo e direito do pai são setados para NULL
se possui apenas um filho o ponteiro apropriado do pai passa a apontar para o filho
se o nó possui dois filhos se um desses dois filhos não possui filhos, use esse nó para
substituir o nó removido
29
Remoção em Árvore Binária de Busca
senão: substituir o valor do nó a ser removido substitua este com o elemento cuja chave é
imediatamente maior (ou menor) é sempre folha?
senão for folha – vá repetindo o procedimento algoritmo?
30
Remoção em Árvore Binária de Busca
2
3 5
4
8
7 10
9
6
Removendo 5: basta que o ponteiro a direita de 4 aponte para
NULL
31
Remoção em Árvore Binária de Busca
Removendo 3: basta que substituir o nó 3 pelo nó 2 continua valendo a regra de formação da árvore
2
3 5
4
8
7 10
9
6
32
Remoção em Árvore Binária de Busca
Removendo 4: basta que o substituir 4 pelo 5 continua valendo a regra de formação da árvore
2
3 5
4
8
7 10
9
6
33
Remoção em Árvore Binária de Busca
Removendo 7 (raiz): substituir o 7 pelo imediatamente maior: 8 – como
determinar? resulta na remoção do elemento de chave 8
2
3 5
4
9
8
12
11
10
7
34
Árvore Binária de Busca A árvore obtida depende da seqüência de
inserção de nós Para que a árvore binária de busca seja
completa completa tem altura mínima o conjunto das chaves deve ser reordenado árvore comum - O (n) árvore completa - O (log n)
35
Árvore Binária de Busca uma árvore binária de busca completa
o conjunto das chaves deve ser re-ordenado sejam so e s n+1 duas chaves fictícias e já inseridas a cada passo inserir em T uma nova chave que seja
de índice médio entre i e j - duas chaves já inseridas
36
Árvore Binária de Busca árvore completa: ótima para a busca
quando a freqüência de acesso aos nós é igual
normalmente estas freqüências são diferentes
é interessante construir uma árvore binária que seja a melhor possível no que diz respeito à busca para freqüências conhecidas
37
Eficiência da Árvore de Busca Depende da ordem original dos dados Se o array original está ordenado (ascendente ou
descendente), as árvores resultantes só tem filhos a direita ou a esquerda a inserção do 1o. nó - 0 comparações a inserção do 2o. nó - 2 comparações a inserção do 3o. nó - 3 comparações
2 + 3 +....+n = n*(n+1)/2 -1 Complexidade - O(n2) - para inserir n nós
38
Eficiência da Árvore de Busca Se a lista original estiver organizada, e se
uma árvore completa (parecida com completa) for se formando:
complexidade da inserção = O( n log n )
39
Eficiência da Árvore de Busca 12, 8, 17, 4, 16 A árvore é balanceada
4
8
2 6
1 7
1 2