Árvore binária -definiçãowebserver2.tecgraf.puc-rio.br/eda/EDA_01_ArvBinBusca.pdf · Árvore...
Transcript of Árvore binária -definiçãowebserver2.tecgraf.puc-rio.br/eda/EDA_01_ArvBinBusca.pdf · Árvore...
Árvore binária - definição
árvore binária: conjunto finito de nósÆ (árvore vazia)
{raiz, sub-árvore esquerda, sub-árvore direita}, ondesae e sad são conjuntos disjuntos
07/03/2018 1
Æ raiz
sae sad
ou/* nó da árvore binária */struct Node {
int raiz;Node* sae;Node* sad;
};
© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1
Árvore binária
07/03/2018 2
(A (B) ( ))
¹A
B
A
B
(A ( ) (B))
© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1
Exemplo
07/03/2018 © 2011 DI, PUC-Rio • Estruturas de Dados Avançadas • 2011.2 3
árvores binárias representando expressões
aritméticas:
nós folhas representam operandos
nós internos operadores
exemplo: (3+6)*(4-1)+5*
+ –
1463
5
+
07/03/2018 (c) Dept. Informática - PUC-Rio 4
Árvores binárias
• Notação textual:
– a árvore vazia é representada por <>
– árvores não vazias por <raiz sae sad>
– exemplo:
<a <b <> <d<><>> > <c <e<><>> <f<><>>> >
a
b c
fed
07/03/2018 (c) Dept. Informática - PUC-Rio 5
Árvores binárias - Ordens de percurso
• Ordens de percurso:
– pré-ordem:
• trata raiz, percorre sae, percorre sad
• exemplo: a b d c e f
– ordem simétrica:
• percorre sae, trata raiz, percorre sad
• exemplo: b d a e c f
– pós-ordem:
• percorre sae, percorre sad, trata raiz
• exemplo: d b e f c a
a
b c
fed
Percurso – pré-ordem
07/03/2018 6
A
B
C
D
E
L
GK F
H
J
IM
A B E K * L F C G D H M I * J * *
© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1
*
Percurso – pós-ordem
07/03/2018 7
A
B
C
D
E
L
GK F
H
J
IM
ABEKL F CG DHM I* J * *
© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1
*
Percurso – ordem simétrica
07/03/2018 8
A
B
C
D
E
L
GK F
H
J
IM
ABEK L F CG DHM I* J * *
© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1
07/03/2018 (c) Dept. Informática - PUC-Rio 9
Árvores binárias - Altura
• Propriedade fundamental de árvores– só existe um caminho da raiz para qualquer nó
• Altura de uma árvore
– comprimento do caminho mais longo da raiz até uma das folhas
• a altura de uma árvore com um único nó raiz é zero
• a altura de uma árvore vazia é -1
– exemplo:
• h = 2a
b c
fed
07/03/2018 (c) Dept. Informática - PUC-Rio 10
Árvores binárias - Altura
• Nível de um nó
– a raiz está no nível 0, seus filhos diretos no nível 1, ...
– o último nível da árvore é a altura da árvore
a
b c
fed
nível 0
nível 1
nível 2
07/03/2018 (c) Dept. Informática - PUC-Rio 11
Árvores binárias - Altura
• Árvore cheia – todos os seus nós internos têm duas sub-árvores associadas
– número n de nós de uma árvore cheia de altura h
n = 12 1 -+h
nível 0: 20 = 1 nó
nível 1: 21 = 2 nós
nível 2: 22 = 4 nós
nível 3: 23 = 8 nós
07/03/2018 (c) Dept. Informática - PUC-Rio 12
Árvores binárias - Altura
• Árvore degenerada – todos os seus nós internos têm uma única sub-árvore associada
– número n de nós de uma árvore degenerada de altura h
n = h+1
07/03/2018 (c) Dept. Informática - PUC-Rio 13
Árvores binárias - Altura
• Esforço computacional necessário para alcançar qualquer nó da árvore
– proporcional à altura da árvore
– altura de uma árvore binária com n nós
• mínima: proporcional a log n (caso da árvore cheia)
• máxima: proporcional a n (caso da árvore degenerada)
Árvore binária - conceitos
número máximo de nós no nível i:2i
número máximo de nós na árvore de altura k:2k+1 - 1, k ³ 0 ( = 2k … + 22+ 2 + 1)
árvore binária cheia de altura k:árvore que possui 2k+1 – 1 nós
se k = 2, árvore binária
cheia possui 23-1 = 7 nós
07/03/2018 14
A
C
G
B
FD E
nível:
0
1
2
© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1
Árvore binária – conceitos (cont.)
árvore binária completatoda folha está no último ou penúltimo nível
árvore estritamente bináriacada nó tem 0 ou dois filhos
07/03/2018 15
A
CB
D E
nível:
0
1
2
A
B C
A
estritamente binárias
A
B
A
B
NÃO estritamente binárias
© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1
ClasseÁrvoreBinária
07/03/2018 16
............. ... . ... . . . ..... .. .... .. . ..... .... . ..© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1
struct AbbNo{
int _chave;AbbNo* _esq; AbbNo* _dir;
};
class Abb{public:
Abb(); Abb(c int& info); Abb(const Abb& orig);~Abb(); void insere(int info);bool remove(int info); void mostra(char* title);int altura();int tamanho();
private:AbbNo* _raiz;
};
O que vamos estudar de árvores binárias?
0.000000
2.000000
4.000000
6.000000
8.000000
10.000000
12.000000
14.000000
16.000000
500
1000
2000
4000
8000
16000
32000
64000
1E+05
3E+05
5E+05
1E+06
Ab
Abb
Avl
Rbt
tamanho do problema
tem
po d
e in
serç
aoe
rem
oção
07/03/2018 17© 2012 DI, PUC-Rio • Estruturas de Dados Avançadas • 2012.1
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++© 2017 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++07/03/2018 18
Árvores binárias de busca(Abb)
< 15 > 15
< 10 > 10
15
30
50
10
243 12
14
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
< 15 > 15
< 10 > 10
Definição de uma Abb
Abb é uma árvore binária vazia,
ou1. cada nó possui uma chave
2. as chaves na sub-árvore esquerda (se
houver) são menores do que a chave da raiz
3. as chaves na sub-árvore direita (se
houver) são maiores do que a chave da raiz
4. as sub-árvores esquerda e direita são
árvores binárias de busca
07/03/2018 19
15
30
50
10
243 12
14
Æ
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
Uma implementação de Abb em C++
struct Node {int _key;Node* _up;Node* _left;Node* _right;
};
class Abb {public:
Abb();Abb(int key);…
private: Node* _root;
};
abb.hppAbb::Abb() {
_root = nullptr;}
Abb::Abb(int key) {_root = new Node;_root->_key = key;_root->_left = nullptr;_root->_right = nullptr;_root->_up = nullptr;
}
07/03/2018 20
abb.cpp
left right
up
key
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
Busca numa Abb
15
10
5
15
18
20
25
16 19 22
21
30
19
Não é o 15, é maior. Busque na s.a.d.
07/03/2018 21
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
Algoritmo para busca em ABBs
1. Começe a busca pelo nó raiz
2. Se a árvore for vazia retorne NULL
3. CC se a chave procurada for menor que a chave do nó, procure na sub-árvore à esquerda e responda com a resposta que você receber
4. CC se a chave procurada for maior que a chave do nó, procure na sub-árvore à direita e responda com a respostaque você receber
5. CC se for igual responda com o endereço do nó
CC = caso contrário
Node* Abb::search(int key);
07/03/2018 22
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
Busca numa abb
07/03/2018 23
Node* abb::search(int key) {return searchrec(_root, key);
}
Node* Abb::searchrec(Node* node, int key) {if (node == nullptr) return nullptr;else if (node->_key == key) return node;else if (key > node->_key) return searchrec(node->_right, key);else return searchrec(node->_left, key);
}
1. Começe a busca pelo nó raiz
2. Se a árvore for vazia retorne NULL
3. CC se a chave procurada for menor que a chave do nó, procure na sub-árvore à esquerda e responda com a resposta que você receber
4. CC se a chave procurada for maior que a chave do nó, procure na sub-árvore à direita e responda com a resposta quevocê receber
5. CC se for igual responda com o endereçodo nó
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
Busca iterativa numa Abb
15
10
5
15
18
20
25
16 19 22
21
30
19
Busca comoem lista, com o nextvariando
07/03/2018 24
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
Menor nó numa Abb
15
10
5
15
18
20
16 19
07/03/2018 25
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
Menor nó numa Abb
15
10
5
15
18
20
16 19
5
7
07/03/2018 26
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
Menor nó numa Abb
É a chave do nó mais à esquerda da árvore
1. Começando pelo nó raiz
2. Se a árvore for vazia retorne -1
3. Caso contrário, caminhe sempre à esquerda
enquanto o filho esquerdo não for NULL
int Abb::min ( );
07/03/2018 27
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
Menor chave numa Abb
int Abb::min(){
Node* p=_root;
if (p==nullptr) return -1;
while (p->_left!=nullptr) p = p->_left;
return p->_key;
}
07/03/2018 28
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
Sucessor numa Abb
15
10
5
15
18
20
25
16 19 22
21
30
20
Quem é o sucessor de 20?
07/03/2018 29
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
15
10
5
15
18
20
25
16 19 22
21
30
19
Quem é o sucessor de 19?
07/03/2018 30
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
Sucessor numa Abb (next)
1. Ache o o nó que contém a a key;
2. Se não achar return NULL
3. CC se o nó tiver uma sub-árvore à direita, retorne o
mínimo dela
4. CC suba na árvore procurando o primeiro ancestral que seja maior que seu filho. Ou seja, o nó
corrente vai estar na sua sub-árvore à esquerda. Se
nessa busca você chegar na raiz (ancestral NULL),
retorne NULL.
CC = caso contrário
int Abb::next (int key);
07/03/2018 31
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
Sucessor numa Abb (prox)
07/03/2018 32
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
Percorrendo em ordem os nós de uma Abb
Lista* p;
for (p=lst; p!=NULL; p=p->prox) {
…
}
07/03/2018 33
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
Inserção numa Abb
15
10
518
20
25
16 19 22
21
30
17
Insere somentequando houverespaço
07/03/2018 34
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
Inserção numa Abb
15
10
5
15
18
20
25
16 19 22
21
30
17
07/03/2018 35
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
Inserção numa abb
1. Começando pelo nó raiz
2. Se o nó for NULL crie num nó com a chave dada e retorne o endereçodele.
3. CC se a chave dada for maior que a chave corrente:1. o nó tiver uma sub-árvore à direita, insira nela a chave
2. CC crie um nó com a chave dada e este será o filho à direita do nócorrente
4. CC se a chave dada for menor que a chave corrente:1. o nó tiver uma sub-árvore à esquerda, insira nela a chave
2. CC crie um nó com a chave dada e este será o filho à esquerda do nócorrente
5. CC se a chave for igual, troque a informação associada à chave (naárvore de inteiros não faça nada)
Abb* abb_insere (Abb* r, int val);
07/03/2018 36
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++07/03/2018 37
Inserção recursiva numa abb
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++07/03/2018 38
Inserção iterativa numa abb
1. Se a árvore for vazia crie um nó e retorne
2. CC começe a busca pelo nó raiz, desça na árvore mantendo o
nó anterior (pai)
3. Enquanto o nó não for NULL ou não contiver a chave dada:
1. Se a chave do nó for maior que a chave dada, vá para o filho à
direita
2. Se a chave do nó for menor que a chave dada, vá para o filho à
esquerda
4. Crie o nó com a chave dada e o coloque como filho do pai
Abb* abb_insere_iterativa (Abb* r, int val);
07/03/2018 38
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++07/03/2018 39
Inserção recursiva numa abb
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
Três casos:
1. nó folha
2. nó possui uma sub-árvore
3. nó possui duas sub-árvores
Remoção de um nó de uma abb
07/03/2018 40
............. ... . ... . . . ..... .. .... .. . ..... .... . ..
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
Remoção numa Abb
15
10
518
20
25
16 19 22
21
30
19
07/03/2018 41
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
Remoção numa Abb
15
10
5
20
18 25
16 22
21
30
07/03/2018 42
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
Remoção numa Abb
15
10
518
20
25
16 19 22
21
30
22
07/03/2018 43
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
Remoção numa Abb
07/03/2018 44
15
10
518
20
25
16 19
21
30
22
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
Remoção numa Abb
15
10
518
20
25
16 19 22
21
30
20
07/03/2018 45
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
Remoção numa Abb
15
10
518
20
25
16 19 22
21
30
20
Quem é o sucessor de 20?
07/03/2018 46
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
Remoção numa Abb
15
10
518
21
25
16 19 22 30
07/03/2018 47
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
Remoção numa Abb
15
10
518
21
25
16 19 22 30
50
07/03/2018 48
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
Três casos:
1. nó folha ou possui apenas uma sub-árvorepromove a sub-árvore
2. nó possui duas sub-árvores
Remoção de um nó de uma abb
07/03/2018 49
15
303
1
15
3010
3
15
3010
3
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
Três casos:
1. nó folha
2. nó possui uma sub-árvore
3. nó possui duas sub-árvores1. coloque a informação do sucessor no nó
2. remova o sucessor
Remoção de um nó de uma abb
07/03/2018 50
............. ... . ... . . . ..... .. .... .. . ..... .... . ..
15
3010
3 12
11 13
15
3011
3 12
10 13
15
3011
3 12
13
3
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
Remoção de um nó numa abb
1. Ache o nó a ser removido
2. Se ele tiver um ou menos filhos, faça a
ligação avô-neto
3. CC se ele tiver dois filhos, procure o
sucessor, troque a info do nó pela do seu
sucessor. Apague o sucessor.
07/03/2018 51
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
Remoção de um nó numa abb (obs)
1. O sucessor é sempre o nó de menor chave
da sub-arvore à direita
2. Ao retirar um nó temos que atualizar os
campos de seu pai e de seu filho para que
eles se referenciem
07/03/2018 52
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
Exemplo
07/03/2018 53
Abb a(7); a.insert(4);
a.insert(9);
a.insert(2);
a.insert(5);
a.insert(8);
a.insert(10);
a.insert(1);
a.insert(3);
a.insert(6);
10
9
8
7
5
4
3
2
1 6
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
Árvore binária de busca degenerada
todos nós não terminais possuem 1 filho
qualquer nó pode ser alcançado
a partir da raiz em O(n) passos
07/03/2018 54
10
9
8
7
6
5
4
3
2
1
1
10
2
9
3
8
4
7
5
6
© 2018 DI, PUC-Rio • Estruturas de Dados Avançadas – Versão C++
Árvore binária de busca balanceada
|he-hd| £ 1he = altura da sub-árvore esquerda
hd = altura da sub-árvore direita
qualquer nó pode ser alcançado a partir da raiz em O(log(n)) passos
(quase) todos os nós não terminaistêm dois filhos
07/03/2018 55
10
9
8
7
5
4
3
2
1 6