Você está na página 1de 12

Algoritmos e

Estruturas de Dados I

Árvores Binárias de Busca


versão 1.3

Prof. D.Sc. Fabiano Oliveira


fabiano.oliveira@ime.uerj.br
Árvores Binárias de Busca
● Uma árvore binária de busca T é uma
árvore binária tal que cada nó N de T possui
uma chave distinta r(N) ∈ S correspondente
e se R é nó raiz de T, então:
■ para todo nó X da subárvore esquerda de R,
r(X) < r(R)
■ para todo nó X da subárvore direita de R,
r(X) > r(R)
■ as subárvores de R também são árvores de
busca
Árvores Binárias de Busca
● Naturalmente, se |S| > 1, existem diversas
árvores binárias de busca para S

Exemplo para S = {1, 2, 3, 4, 5, 6, 7}


1 5

5 2 6

3 7 1 3 7

2 4 6 4
Árvores Binárias de Busca
● Busca
função Busca(T: ^No, x: Inteiro): ^No
//Assume: --
//Garante: se x ∈ S, Busca^.chave = x
// se x ∉ S, Busca = NULO
início
enquanto T ≠ NULO faça
se T^.chave = x então
retornar (T)
senão se x < T^.chave então
T ← T^.Esq
senão
T ← T^.Dir
fim-se
fim-enquanto
retornar (NULO)
fim-função
Árvores Binárias de Busca
● Busca
função Busca(T: ^No, x: Inteiro): ^No
//Assume: -- Complexidade de Tempo:
//Garante: se x ∈ S, Busca^.chave = x Uma execução:
// se x ∉ S, Busca = NULO O(h(T)) = O(n)
início
enquanto T ≠ NULO faça
se T^.chave = x então
retornar (T) Complexidade de Espaço:
senão se x < T^.chave então Espaço Auxiliar 0
T ← T^.Esq Espaço Total: θ(1)
senão
T ← T^.Dir
fim-se
fim-enquanto
retornar (NULO)
fim-função
Árvores Binárias de Busca
● Busca
função Busca(ref T: ^No, x: Inteiro, ref PosIns: ^^No): ^No
//Assume: --
//Garante: se x ∈ S, Busca^.chave = x, se x ∉ S, Busca = NULO,
// PosIns^ é o ponteiro que deveria apontar o nó buscado, se ele existisse
var T2: ^No
início
PosIns, T2 ← @T, T
enquanto T2 ≠ NULO faça
se T2^.chave = x então Esta variante é
retornar (T2) interessante para
senão se x < T^.chave então informar onde o
T2, PosIns ← T2^.Esq, @(T2^.Esq) elemento procurado
senão deveria estar no
T2, PosIns ← T2^.Dir, @(T2^.Dir) caso em que a
fim-se chave não é
fim-enquanto encontrada
retornar (NULO)
fim-função
Árvores Binárias de Busca
● Inserção
procedimento Insere(ref T: ^No, x: ^No)
//Assume: T é árvore binária de busca, x.chave ∉ S
//Garante: x inserido em T que continua binária de busca
var PosIns: ^^No, N: ^No
início
N ← Busca(T, x.chave, PosIns)
se N = NULO então
PosIns^, x^.Esq, x^.Dir ← x, NULO, NULO
senão
Exceção("Chave existente")
fim-se
fim-procedimento
Árvores Binárias de Busca
● Inserção Complexidade de Tempo:
Uma execução:
procedimento Insere(ref T: ^No, x: ^No) O(h(T)) = O(n)
//Assume: T é árvore binária de busca, x.chave ∉ S
//Garante: x inserido em T que continua binária de busca
var PosIns: ^^No, N: ^No
início
N ← Busca(T, x.chave, PosIns)
se N = NULO então
PosIns^, x^.Esq, x^.Dir ← x, NULO, NULO
senão
Exceção("Chave existente")
Complexidade de Espaço:
fim-se
Espaço Auxiliar θ(1)
fim-procedimento Espaço Total: θ(1)
Árvores Binárias de Busca
● Construção

○ O algoritmo consiste de inserir as N chaves uma a


uma, até que a árvore esteja construída. Este
algoritmo tem complexidade O(N2). (Por quê?)

○ Podemos fazer com que o algoritmo de construção


baseado em inserções uma a uma tenha
complexidade de tempo O(N lg N) escolhendo
apropriadamente a ordem de inserção das chaves.
(Qual é esta ordem?)
Árvores Binárias de Busca
● Remoção
função Remove(ref T: ^No, x: Inteiro): ^No
//Assume: T é árvore binária de busca, x ∈ S
//Garante: Remove = nó com chave x, removido de T que continua binária de busca
var N, NS, paiNS: ^No, PosIns: ^^No
início
N ← Busca(T, x, PosIns)
se N ≠ NULO então
//modificação da árvore (slide seguinte)
retornar (N)
senão
Exceção("Chave inexistente")
fim-se
fim-procedimento
Árvores Binárias de Busca
● Remoção
//modificação da árvore
se N^.Esq ≠ NULO então
se N^.Esq^.Dir = NULO então
N^.Esq^.Dir, PosIns^ ← N^.Dir, N^.Esq
senão
NS, paiNS ← N^.Esq^.Dir, N^.Esq
enquanto NS^.Dir ≠ NULO faça NS, paiNS ← NS^.Dir, NS
paiNS^.Dir, NS^.Esq, NS^.Dir, PosIns^ ←
NS^.Esq, N^.Esq, N^.Dir, NS
fim-se
senão
PosIns^ ← N^.Dir
fim-se
Exercícios
1. Quantas árvore binárias de busca podem representar o conjunto de
chaves S = {1, 2, 3, 4, 5, 6}?

2. Escreva um algoritmo que ordene um vetor A de N elementos com o


seguinte método; (a) criar uma árvore binária de busca com os elementos
como chaves, inserindo as chaves A(1), A(2), …, A(N) nesta ordem na
árvore binária de busca; (b) faça um percurso inordem, onde a visita a um
nó X corresponde à escrita da chave de X. Qual a complexidade de
espaço e de tempo deste algoritmo?

3. Escreva uma versão de Busca() para árvores binárias de busca que, no


caso de não encontrar o elemento, retorne em duas variávels passadas
por referência: (i) o ponteiro para o elemento onde a chave buscada
deveria ser filha (NULO se a chave buscada deveria ser a raiz) e (ii) um
flag para indicar se a chave buscada deveria ser inserida como filho à
esquerda ou á direita do nó retornado em (i)

Você também pode gostar