• Nenhum resultado encontrado

06-Binárias-AED-UFRPE-pbcm

N/A
N/A
Protected

Academic year: 2021

Share "06-Binárias-AED-UFRPE-pbcm"

Copied!
65
0
0

Texto

(1)

Algoritmos e Estruturas de Dados Prof. Péricles Miranda

{periclesmiranda@gmail.com}

(2)

Conteúdo

Introdução

Árvores de Busca

Árvores Binárias de Busca

Busca e Inserção

(3)
(4)

Estruturas Lineares

 Estruturas lineares, como listas ligadas, apresentam

como um grande fator limitante ao seu uso o acesso puramente sequencial aos elementos da estrutura.

 Em diversas aplicações práticas, o uso de estruturas mais

complexas faz-se necessário.

 Estruturas dinâmicas melhoradas podem ser facilmente

(5)

Estruturas Não Lineares

 Uma melhoria simples pode ser a divisão da lista em dois

grupos:

 Porém esta solução apenas divide o problema na metade,

(6)

Estruturas Não Lineares

(7)

Estruturas Não Lineares

 As estruturas que fazem a divisão dos nós a cada

elemento são conhecidas como árvores de busca.

 Veremos que, de modo geral, as árvores de busca são de

fácil representação computacional, e além disso, são úteis para a solução de diversos problemas práticos.

(8)
(9)

Árvores de Busca

Uma árvore enraizada T, ou simplesmente árvore, é um

conjunto finito de elementos (nós) tais que:T = Ø, e a árvore é dita vazia, ou

Existe um nó especial, r, chamado raiz de T; os nós restantes constituem um único conjunto vazio ou são divididos em m ≥ 1 conjuntos disjuntos não vazios, as subárvores de r, ou simplesmente subárvores, cada qual, por sua vez, uma árvore.

(10)

Árvores de Busca

A forma mais comum de representação de uma

árvore e de seus elementos é através de um

gráfico hierarquizado.

Um conjunto de árvores é chamado de floresta.

Se v é um nó de T, a notação T

v

indica a subárvore

(11)

Árvores de Busca

Seja v o nó raiz da subárvore T

v

de T.

Os nós

𝑤1, 𝑤2, … , 𝑤𝑗

das subárvores de T

v

são

chamados filhos de v, v é chamado pai dos nós

𝑤1, 𝑤2, … , 𝑤𝑗

e os nós

𝑤1, 𝑤2, … , 𝑤𝑗

são irmãos

entre si.

O número de filhos de um nó é chamado grau de

(12)

Árvores de Busca

Se x pertence à subárvore de Tv,x é descendente de v, e v

é ancestral de x.

Nesse caso, se x é diferente de v, x é descendente próprio de

v, e v é ancestral próprio de x.

 Um nó que não possui descendentes próprios é chamado

de folha.

(13)

Árvores de Busca

O nível de um nó é definido como o número de nós no caminho

entre o nó em questão e a raiz da árvore, contando o nó em questão.

 O nível da raiz é igual a 1.

A altura de um nó é o número de nós do maior caminho do nó em

questão até um de seus descendentes.

 As folhas de uma árvore têm altura 1.

(14)

Árvores de Busca

A B D G H F I E C Raiz Folhas h(T)

(15)
(16)

Árvores Binárias de Busca

Dentre as árvores de busca, as binárias são as mais comuns.Uma árvore binária T é um conjunto finito de nós tais que:

T = Ø, e a árvore é dita vazia, ou

Existe um nó especial, r, chamado raiz de T; os nós restantes

podem ser divididos em dois subconjuntos disjuntos, 𝑇𝑟𝐸e 𝑇𝑟𝐷,

que são as subárvores esquerda e direita de r, respectivamente, e que também são árvores binárias.

(17)

Árvores Binárias de Busca - Representação

A B D G H F I E C h(T)

(18)

Árvore Binária de Busca – Alocação

Dinâmica

raiz

(19)

Árvores Binárias de Busca

 Em uma árvore binária de busca, os elementos são

organizados de tal forma que:

Todos os elementos na subárvore da esquerda de cada nó k têm

valor de chave menor ou igual à chave do nó k;

Todos os elementos na subárvore da direita de cada nó k têm

(20)

Árvores Binárias de Busca

 Os elementos são organizados de forma que:

k

q ≤ k q > k

Subárvore

(21)

Exemplo

 Inserir: 45, 18, 30, 60, 81, 96, 101, 5, 8, 3

(22)

Exemplo

 Inserir: 45, 18, 30, 60, 81, 96, 101, 5, 8, 3 45 18 30 60 81 96 101 5 3 8

(23)
(24)

Busca em Árvores Binárias

procedimento busca_bin(x, pt) //inicialmente,

//pt é a raiz de T

se pt = NIL ou pt.chave = x então

retorne pt

se x < pt.chave então

busca_bin(x, pt.esq)

senão busca_bin(x, pt.dir)

(25)

Busca em Árvores Binárias

procedimento busca_bin2(x, T) 𝑝𝑡 ← 𝑇. 𝑟𝑎𝑖𝑧;

enquanto pt ≠ NIL e pt.chave ≠ x faça se x < pt.chave então

𝑝𝑡 ← 𝑝𝑡. 𝑒𝑠𝑞;

senão 𝑝𝑡 ← 𝑝𝑡. 𝑑𝑖𝑟;

retorne pt fim_busca_bin2

(26)

Inserção em Árvores Binárias

procedimento inserir_bin(x, T)

𝑦 ← 𝑁𝐼𝐿; 𝑝𝑡 ← 𝑇. 𝑟𝑎𝑖𝑧;

enquanto pt ≠ NIL faça

𝑦 ← 𝑝𝑡;

se x.chave ≤ pt.chave então

𝑝𝑡 ← 𝑝𝑡. 𝑒𝑠𝑞; senão 𝑝𝑡 ← 𝑝𝑡. 𝑑𝑖𝑟; fim_enquanto 𝑥. 𝑝𝑎𝑖 ← 𝑦; se y = NIL então 𝑇. 𝑟𝑎𝑖𝑧 ← 𝑥;

senão se x.chave ≤ y.chave então

𝑦. 𝑒𝑠𝑞 ← 𝑥;

(27)

Custo Computacional

 Os procedimentos de percurso (em pré-ordem, ordem e

pós-ordem) possuem custo computacional da ordem de θ(𝑛), pois todos os nós precisarão ser percorridos.

 Os procedimentos de inserção e busca possuem

complexidade da ordem de O(h(T)), ou seja, O(log2 n),

onde n é o número de nós na árvore, quando a árvore é

(28)

Custo Computacional

Porém, dependendo da ordem de inserção dos

elementos na árvore binária de busca, a mesma pode

degenerar, tornando-se uma estrutura próxima de

uma linear.

 Se nós forem inseridos em ordem decrescente de

chaves, cada nó estaria à esquerda de seu nó-pai;

 Se nós forem inseridos em ordem crescente, cada nós estará à direita de seu nó-pai.

(29)

Árvores Binárias de Busca - Representação

A B D G H F I E C h(T)

(30)

Árvores Binárias de Busca - Representação

A B I H E h(T)

(31)
(32)

Remoção – Nó com Zero ou Um Filho

 A estratégia geral para a remoção de um nó em uma

árvore binária T possui três casos básicos.

Remoção de um nó x que não possui filhos (folha): basta

apenas modificar o nó-pai de x substituindo x por NIL.

Remoção de um nó x com apenas um filho: fazemos

com que esse filho de x substitua seu lugar em relação ao nó-pai de x.

(33)

Remoção - Nó com Dois Filhos

O sucessor de x (que deve estar em sua subárvore direita) deve ser

usado para assumir a posição de x em relação ao seu nó-pai.

O restante da subárvore direita de x torna-se a subárvore direita

de seu nó sucessor, e a subárvore esquerda de x torna-se a nova subárvore esquerda de seu sucessor.

 A análise é diferenciada levando em consideração quando o

(34)

Procedimentos Úteis

procedimento minimo(pt) //inicialmente,

enquanto pt.esq ≠ NIL faça//pt é a raiz de T

𝑝𝑡 ← 𝑝𝑡. 𝑒𝑠𝑞;

retorne pt; fim_minimo

procedimento maximo(pt) //inicialmente,

enquanto pt.dir ≠ NIL faça//pt é a raiz de T

𝑝𝑡 ← 𝑝𝑡. 𝑑𝑖𝑟;

retorne pt; fim_maximo

(35)

Procedimentos Úteis

procedimento sucessor(x)

se x.dir ≠ NIL faça

retorne minimo(x.dir)

𝑦 ← 𝑥. 𝑝𝑎𝑖;

enquanto y ≠ NIL e x.chave = y.dir.chave faça

𝑥 ← 𝑦;

𝑦 ← 𝑦. 𝑝𝑎𝑖;

retorne y fim_sucessor

(36)

Exemplo

Sucessor do nó 13:

15 6 7 18 20 16 13 3 2 4 9

(37)

Exemplo

Sucessor do nó 13:

15 6 7 18 20 16 13 3 2 4

(38)

Exemplo

Sucessor do nó 13:

15 6 7 18 20 16 13 3 2 4 9 x y

(39)

Exemplo

Sucessor do nó 13:

15 6 7 18 20 16 13 3 2 4 9 x y

(40)

Exemplo

Sucessor do nó 13:

15 6 7 18 20 16 13 3 2 4 9 x y

(41)

Exemplo

Sucessor do nó 13:

15 6 7 18 20 16 13 3 2 4 9 x 𝒚 O sucessor de 13 é 15 x ≠ y.dir

(42)

Remoção – Nó com zero ou um filho

procedimento remover(x, T) 𝑝𝑡 ← 𝑏𝑢𝑠𝑐𝑎_𝑏𝑖𝑛(𝑥, 𝑇);

se pt = NIL então “árvore não contém elemento buscado” senão se pt.esq = NIL e pt.dir = NIL então

//remover ligação entre pt.pai e pt

senão se pt.esq ≠ NIL XOR pt.dir ≠ NIL então

//fazer pt.pai apontar para o filho não nulo de pt //remover ligação entre pt e seu filho

senão //pt tem os dois filhos

//substituir pt pelo seu sucessor

(43)

Exemplo 1

Remover: 101

45 18 30 60 81 96 101 5 3 8 Nó 101 não tem filhos (folha)

(44)

Exemplo 1

Remover: 101

45 18 30 60 81 96 101 5 3 8 Cortar ligação entre o nó 101 e seu pai x

(45)

Exemplo 1

Remover: 101

45 18 30 60 81 96 5 3 8

(46)

Exemplo 2

Remover: 81

45 18 30 60 81 96 101 5 3 8 Nó 81 tem um filho (nó 96)

(47)

Exemplo 2

Remover: 81

45 18 30 60 81 96 101 5 3 8 Fazer pai de 81 (nó 60) apontar para o único

filho de 81 (nó 96)

Remover ligação entre 81 e seu filho

(nó 96)

(48)

Exemplo 2

Remover: 81

45 18 30 60 96 101 5 3 8

(49)

Exemplo 3

Remover: 18

45 18 60 5 30 81 96 101 3 2 10 7 8 15 Sucessor do nó 18

(50)

Exemplo 3

Remover: 18

45 30 60 5 81 96 101 3 2 10 7 8 15

(51)

Exemplo 4

Remover: 5

45 18 60 5 30 81 96 101 3 2 10 7 8 15 Sucessor do nó 5

(52)

Exemplo 4

Remover: 5

45 18 60 5 30 81 96 101 3 2 10 7 8 15 Sucessor do nó 5 x x

(53)

Exemplo 4

Remover: 5

45 18 60 7 30 81 96 101 3 2 10 8 15

(54)

Percursos em Árvores Binárias

 Um percurso pode ser entendido como uma visita

simétrica a cada nó da árvore.

 A visita a um nó pode ser vista como uma operação que

faça uso da informação contida no mesmo para algum fim.

 Existem três tipos básicos de percursos em uma árvore

binária:

 Percurso em pré-ordem;  Percurso em ordem;

(55)

Percursos em Árvores Binárias

8 5 12 15 19 14 2 3 10

(56)

Percursos em Árvores Binárias

procedimento pre_ordem(pt) //inicialmente,

visitar(pt) //pt é a raiz de T

se pt.esq ≠ NIL então

pre_ordem(pt.esq)

se pt.dir ≠ NIL então

pre_ordem(pt.dir) fim_pre_ordem

(57)

Percurso em Pré-Ordem

Resultado: 8 5 2 3 15 12 10 14 19 8 5 12 15 19 14 2 3 10

(58)

Percursos em Árvores Binárias

procedimento ordem(pt) //inicialmente,

se pt.esq ≠ NIL então //pt é a raiz de T

ordem(pt.esq) visitar(pt)

se pt.dir ≠ NIL então

ordem(pt.dir) fim_ordem

(59)

Percurso em Ordem

Resultado: 2 3 5 8 10 12 14 15 19 8 5 12 15 19 14 2 3 10

(60)

Percursos em Árvores Binárias

procedimento pos_ordem(pt) //inicialmente,

se pt.esq ≠ NIL então //pt é a raiz de T

pos_ordem(pt.esq)

se pt.dir ≠ NIL então

pos_ordem(pt.dir) visitar(pt)

(61)

Percurso em Pós-Ordem

Resultado: 3 2 5 10 14 12 19 15 8 8 5 12 15 19 14 2 3 10

(62)
(63)

Exercícios

1. Faça a representação gráfica de uma árvore binária de

busca, inicialmente vazia, após a inserção de um elementos na seguinte ordem : 16, 12, 69, 6, 94, 85, 18, 40, 49, 92, 89, 24.

2. Represente para estrutura do exercício anterior, a

estrutura resultante após a remoção dos seguintes elementos sucessivamente: 85, 16 e 40.

3. Reescreva o algoritmo de percurso em pré-ordem

através de laços iterativos (ou seja, sem chamadas recursivas).

(64)

Referências

 CORMEN, H. T.; LEISERSON, C. E.; RIVEST, R. L.;

STEIN, C. Introduction to Algorithms, 3rd ed., Boston:

MIT Press, 2009.

 SZWARCFITER, J.; MARKENZON, L. Estruturas de

Dados e seus Algoritmos, 3ª ed. Rio de Janeiro: LTC, 2010.

 FEOFILOFF, Paulo. Algoritmos em Linguagem C.

(65)

Algoritmos e Estruturas de Dados Prof. Luciano Demétrio Santos Pacífico

{ldsp.ufrpe@gmail.com}

Referências

Documentos relacionados

Informação n.º 1323/19 – Aprovação da atribuição do tarifário social por se enquadrar no artigo 46.º do Regulamento de Serviço de Gestão de Resíduos Urbanos, (Aviso

O Colegiado do Programa de Pós-Graduação em Ensino, Filosofia e História das Ciências da Universidade Federal da Bahia e da Universidade Estadual de Feira de Santana, no uso de

Após a realização de todas as atividades teóricas e práticas de campo, pode-se concluir que não há grande erosão do conhecimento popular e tradicional de plantas medicinais, que

Neste trabalho propôs-se realizar uma investigação cinética e a atividade larvicida frente ao mosquito Aedes aegypti de compostos organofosforados sintetizados no

Resumo Este trabalho tem como objetivo estudar a divisibilidade em dom´ınios de integridade para tanto, ele foi estruturado da seguinte forma: inicialmente faz-se uma abordagem

Essa talvez seja uma explicação para o fato de que, entre os sujeitos associados à agitação, existisse não apenas o senhor Lopes Trovão, mas também homens negros como José

139 http://www.networkadvertising.org/faq#n167... O que a NAI quer nos fazer acreditar é que as estratégias publicitárias de rastreamento são utilizadas para criar melhorias em

- Se o estagiário, ou alguém com contacto direto, tiver sintomas sugestivos de infeção respiratória (febre, tosse, expetoração e/ou falta de ar) NÃO DEVE frequentar