Você está na página 1de 11

Estruturas de Dados | Aulas | Dicionrio | Bibliografia

rvores binrias de busca (BSTs)


Livro de Sedgewick e Wayne: sec.3.2, p.396. Website do livro: resumo sec.3.2, slides. Cdigo fonte,
documentao, e dados de teste de todos os programas do livro: veja algs4.cs.princeton.edu/code/.
rvores binrias de busca (BSTs) servem para implementar TSs ordenadas, ou seja, TSs cujas chaves so
comparveis. BSTs combinam as vantagens das implementaes elementares SequentialSearchST e
BinarySearchST: elas podem ser vistas como uma maneira de implementar busca binria em uma lista ligada.
Resumo:
rvore binria
profundidade de um n e altura da rvore
comprimento interno
percurso de uma rvore binria: inordem, prordem, psordem
BSTs
operaes de busca e insero
desempenho
Prrequisitos:
tabelas de smbolos

O que uma rvore binria?


Antes das BSTs, precisamos discutir algo mais geral: as BTs (detesto
siglas!).
BT = binary tree = rvore binria.
Cada n tem no mximo dois filhos: um esquerdo e um direito.

Exemplo: uma BT com 256 ns.


Uma rvore binria na natureza:

Definio de um n de uma rvore binria:


privateclassNode{
privateNodeleft,right;
}

A raiz (root) o nico n que no filho de outro. Arvore vazia seroot==null.


privateNoderoot;

BTs so estruturas recursivas: cada n da BT raiz de uma subBT.


A profundidade (depth) de um n de uma BT o nmero de links no caminho que vai da raiz at o n.
A altura (height) de uma BT o mximo das profundidades dos ns, ou seja, a profundidade do n mais
profundo.
Uma BT com N ns, tem altura no mximo N1 e no mnimo lg N. Se a altura estiver perto de lg N,
aBT balanceada.
Exemplos:

O comprimento interno (internal path length) de uma BT a soma das profundidades dos seus ns, ou
seja, a soma dos comprimentos de todos os caminhos que levam da raiz at um n. (Esse conceito usado
para estimar o desempenho esperado de TSs implementadas comBSTs).

Exerccios 1
1. Para cada das BTs que aparecem nas figuras desta pgina, escolha um n no "meio" da rvore e diga qual a
profundidade do n.
2. Qual a altura da rvore da figura? Qual a profundidade do
nM? Qual a altura da subrvore cuja raiz M?
3. D a altura e o comprimento interno de cada uma das BTs que
aparecem nas figuras desta pgina.
4. Prove que a profundidade de um n em uma BT com N ns
no mximo N1 e no mnimo0.
5. Prove que a altura de toda BT com N ns no mximo N1 e
no mnimo lg N.
6. Tamanho. Escreva um mtodo recursivo que devolva o nmero de ns de uma rvore binria.
7. (SW 3.2.6, p.416) Altura. Escreva um mtodo (recursivo) que calcule a altura de uma rvore binria. Sua
implementao deve ser do tipo preguioso. (No preciso calcular as profundidades antes.)
8. Acrescente a Node um campo depth para armazenar a profundidade do n. Escreva um mtodo setDepthField() que
defina o valor do campo depth de todos os ns.
9.

(SW 3.2.7) Escreva um mtodo internalPathLength que calcule o comprimento interno de uma BT (rvore
binria).

10. Qual o valor mximo e o mnimo do comprimento interno de uma BT com N ns?
11. Percursos (traversals). Escreva um mtodo que imprima as chaves de uma BT em inordem (ou seja, na ordem esquerda
raizdireita) use recurso. Repita para psordem (ordem esquerdadireitaraiz). Repita para prordem (ordem raiz
esquerdadireita). Use uma fila para armazenar as chaves antes de imprimir.

O que uma rvore binria de busca?


Uma rvore binria de busca (binary search tree) um tipo especial de BT: para cada n x, todos os ns na
subrvore esquerda de x tm chave menor que x.key e todos os ns na subrvore direita de x tm chave
maior quex.key.
BST = binary search tree = rvore binria de busca.
As chaves de uma BST precisam ser comparveis.
Nosso exemplo padro:

Exemplo: Duas BSTs que representam o mesmo conjunto de chaves:

Busca (get) numa BST: o processo muito parecido com a busca binria em um vetor ordenado:

Insero (put) em uma BST: o processo muito mais barato que a insero em um vetor ordenado, pois no
envolve movimentao de dados. [Ignore os dizeres "and increment counts" na figura].

Veja a animao da busca e insero em uma BST.

Exerccios 2
1. (SW 3.2.1, p.416) Importante! Insira as chaves EASYQUESTION , nesta ordem, numa BST inicialmente vazia.
Associe valor i com a isima chave. Desenhe a BST resultante. Em quantos ns voc tocou (ou seja, quantas
comparaes voc fez) para construir aBST?
2. (SW 3.2.4) Suponha que as chaves de uma BST so nmeros inteiros entre 1 e10. Quais das sequncias abaixo no
podem ser as sequncias de chaves examinadas em uma busca pla chave5?
10, 9, 8, 7, 6, 5
4, 10, 8, 6, 5
1, 10, 2, 9, 3, 8, 4, 7, 6, 5
2, 7, 3, 8, 4, 5
1, 2, 10, 4, 8, 5
3. Desenhe as seis BSTs que resultam da insero de cada uma das seis permutaes das chaves ABC numa rvore
inicialmente vazia.
4. Insira as palavras de tinyTale.txt, em ordem, numa BST inicialmente vazia. (Associe o valor i com a isima chave.)
Desenhe a BST resultante. Compare seu desenho com o resultado do cliente de teste de BST.java, que imprime os ns
por nveis.
5. Escreva um mtodo checkBST() que receba uma BT e verifique se ela ou no uma BST. Seu mtodo deve ser
recursivo.

Implementao de TS com BST


[Algoritmo 3.3] A seguinte classe BST implementa uma tabela de smbolos em umaBST. Para definir um
n da rvore, acrescentamos campos key e val aos ns de umaBT.
publicclassBST<KeyextendsComparable<Key>,Value>{
privateNoderoot;

privateclassNode{
privateKeykey;
privateValueval;
privateNodeleft,right;
publicNode(Keykey,Valueval){
this.key=key;
this.val=val;
}
}
publicValueget(Keykey){
returnget(root,key);
}
privateValueget(Nodex,Keykey){
//Consideraapenasasubrvorequetemraizx
if(x==null)returnnull;
intcmp=key.compareTo(x.key);
if(cmp<0)returnget(x.left,key);
elseif(cmp>0)returnget(x.right,key);
elsereturnx.val;
}
publicvoidput(Keykey,Valueval){
root=put(root,key,val);
}
privateNodeput(Nodex,Keykey,Valueval){
//Consideraapenasasubrvorecomraizx
//Devolvearaizdanovasubrvore
if(x==null)returnnewNode(key,val);
intcmp=key.compareTo(x.key);
if(cmp<0)x.left=put(x.left,key,val);
elseif(cmp>0)x.right=put(x.right,key,val);
elsex.val=val;
returnx;
}
}

Exemplo: Rastreamento da insero das chaves SEARCHEXAMPLE, nessa ordem:

[BST trace for standard indexing client, p.402]

Qualquer busca (get) que termina em um n x de profundidadep visita 1 + p ns. O mesmo vale para
insero (put).

Exerccios 3
1. Mtodo size. Considere um mtodo auxiliar size() que devolve o nmero de ns da rvore. Voc j implementou o
mtodo num dos exerccios acima. Aquela implementao conhecida como preguiosa (lazy): ela examina a rvore
toda e assim consome tempo proporcional ao nmero de ns da rvore. Escreva uma implementao mais eficiente
usando a seguinte ideia: acrescente a cada n x um campo N onde ficar registrado o nmero de ns da subrvore cuja
raiz x. Essa ideia leva a uma implementao conhecida como ansiosa (eager). A execuo da verso ansiosa de size()
consome tempo constante (ou seja, independente do nmero de ns da rvore), mas h um preo a pagar: toda
operao de insero precisa atualizar o campo N de todos os ns. Alm de escrever o cdigo ansioso de size(), faa as
alteraes necessrias no cdigo de put().
2. (SW 3.2.6, p.416) Acrescente um campo inteiro h a cada n e escreva uma verso ansiosa do mtodo que calcula a
altura da rvore binria.
3. (SW 3.2.7) Acrescente um campo inteiro ipl a cada n e escreva uma verso ansiosa de um mtodo
internalPathLength() que calcule o comprimento interno de umaBT.

Desempenho no pior caso


Toda operao de busca ou insero visita 1 + p ns, sendo p a profundidade do ltimo n visitado.
Logo, o nmero de ns visitados no passa de 1 + h, sendo h a altura daBST.
(Proposio E) No pior caso, todas as operaes sobre uma BST consomem tempo proporcional altura da
rvore.
Infelizmente, uma BST pode no estar balanceada: sua altura pode estar bem mais perto deN que de lg N.

Embora BSTs desbalanceadas sejam fceis de construir (basta inserir as chaves em ordem apoximadamente
crescente), elas so raras entre as BSTs aleatrias.

Exerccios 4
1. (SW 3.2.25, p.419) Perfect balance. Escreva um programa que insira um conjunto de chaves (as chaves podem ser do
tipo int) em uma BST inicialmente vazia de modo que a BST resultante seja equivalente busca binria em vetor
ordenado no seguinte sentido: a sequncia de comparaes produzida por um get() na BST seja igual sequncia de
comparaes que seria feita pela busca binria num vetor ordenado.
2. (SW 3.2.28) Sofware caching. Modifique a classe BST de modo a manter em uma varivel de instncia o n devolvido
por get() ou put() na chamada anterior. Isso pode economizar tempo se a prxima chamada de get() ou put() tiver a
mesma chave como argumento. (Esse tipo de truque uma heurstica: no garante nada, mas pode ajudar na prtica.)
(Veja o exerccio SW 3.1.25.)

Desempenho esperado (=mdio)


BST tpica construda com 256 chaves inseridas em ordem aleatria (quantos ns tem essa rvore?):

[Typical BST, built from 256 random keys, p.405]

Veja animao no website do livro.


Analisar desempenho esperado de uma implementao sempre difcil.
Quantos ns so visitados, em mdia, durante uma busca em uma BST aleatria com N ns?
Uma BST aleatria uma BST que se obtm inserindo N chaves distintas em ordem aleatria numa rvore
inicialmente vazia (veja um dos exerccios acima).
Qual a altura esperada de uma BST aleatria? Resposta (calculada por L. Devroye): aproximadamente
3 lg N quando N grande.
Portanto, o nmero esperado de ns visitados durante uma busca em uma BST aleatria no passa de 3 lg N.
O nmero esperado de ns visitados durante uma busca ou insero em uma BST aleatria menor que
3 lg N: ele tende a 1.4 lg N quando N aumenta (veja Proposies C eD) no livro.
Ideia da prova para buscas bemsucedidas: Seja C o comprimento interno. O tempo esperado para buscar
todas as chaves (N + C)/N, ou seja, 1 + C/N. Demonstrase que C 2N ln N = 1.3862 N lg N.
A experincia mostra que o nmero 1.4 lg N tambm aproximadamente correto em muitas situaes
prticas.
Exemplo: SW trocou "ST" por "BST" no programacliente FrequencyCounter e usou o programa para examinar
as palavras com 8 ou mais letras do arquivo tale.txt. O grfico (copiado da p.405 do livro) mostra o
nmero de ns visitados (=nmero de comparaes feitas) por cada put(). Os pontos vermelhos do a
mdia corrente:

13.9 no fica longe de 1.4 lg N, que vale 17.6 .


Resultado de experimentos anlogos para palavras de vrios comprimentos nos arquivos tale.txt e
leipzig1M.txt:

tale.txt

leipzig1M.txt

total
palavras

palavras
distintas

teoria

todas palavras

135635

10679

8 letras ou mais

14350

10 letras ou mais

4582

ns visitados
em cada put()

total
palavras

palavras
distintas

ns visitados
em cada put()

prtica

teoria

prtica

18.6

17.5

21191455

534580

23.4

22.1

5737

17.6

13.9

4239597

299 593

22.7

21.4

2260

15.4

13.1

1610829

165555

20.5

19.3

Exerccios 5
1. Para N = 3, quantas BSTs h no nosso modelo de BST aleatria? Quantas so diferentes entre si? Quantas cpias h de
cada dessas rvores no modelo? Calcule a altura esperada e o comprimento interno esperado das BSTs aleatrias de 3
ns. (Veja um dos exerccios acima.)
2. Das 24 BSTs com 4 ns que esto no nosso modelo de BST aleatria, quantas cpias h de cada uma? Calcule a altura
esperada e o comprimento interno esperado das BSTs aleatrias de 4 ns.
3. (SW 3.2.5) Suponha que inserimos N chaves diferentes em uma BST inicialmente vazia e depois fazemos um grande
nmero de buscas. Suponha que sabemos quo frequentemente cada chave ser buscada. Deveramos ter inserido as
chaves na rvore em ordem crescente? em ordem decrescente? em ordem descrescente da frequncia esperada de
busca? em alguma outra ordem?
4. Acrescente um mtodo a BST que calcule o custo mdio de uma busca bemsucedida, supondo que cada chave tem a
mesma probabilidade de ser buscada. (O custo da busca o nmero de comparaes de chaves.)
5. Acrescente um mtodo a BST que calcule o custo mdio de uma busca malsucedida sob a hiptese de hashing
uniforme. (O custo da busca o nmero de comparaes de chaves.)
6. (SW 3.2.38) Desenhos de rvores. Acrescente classe BST um mtodo draw() que faa um desenho da rvore. Dica: Use
variveis de instncia para armazenar as coordenadas dos ns e use um mtodo recursivo para atribuir valores a essas
variveis.

Resumo das 3 implementaes de TSs vistas at aqui


Custos de operaes em implementaes bsicas de tabelas de smbolos:

pior caso
(tabela com N chaves)

caso mdio
(N chaves inseridas
em ordem aleatria)

busca

insero

busca bemsucedida

inseo

busca sequencial
em lista ligada

N/2

busca binria
em vetor ordenado

lg N

lg N

N/2

busca binria
em BST

1.4 lg N

1.4 lg N

Perguntas e respostas
PERGUNTA: A expresso "profundidade de uma rvore binria" faz sentido?
RESPOSTA: No.

Veja rvores binrias e rvores binrias de busca no meu website Projeto de Algoritmos
www.ime.usp.br/~pf/estruturasdedados/
Last modified: Mon May 4 14:31:41 BRT 2015
Paulo Feofiloff
Departamento de Cincia da Computao
Instituto de Matemtica e Estatstica da USP

Você também pode gostar