Professional Documents
Culture Documents
Assim como rvores binrias generalizam a ideia de listas encadeadas, rvores binrias
de busca (= search trees) generalizam a ideia de listas encadeadas crescentes.
Definio
Considere uma rvore binria cujos ns tm um campo chave de um tipo linearmente
ordenado, ou seja, de um tipo (como int e string) que admite comparaes. Podemos
supor que os ns da rvore tm a seguinte estrutura:
struct cel {
int
chave;
int
conteudo;
struct cel *esq;
struct cel *dir;
};
typedef struct cel noh; /* n */
Uma rvore binria deste tipo de busca (em relao ao campo chave) se cada n X
tem a seguinte propriedade: a chave de X
1. maior ou igual chave de qualquer n na subrvore esquerda de X e
2. menor ou igual chave de qualquer n na subrvore direita de X.
Em outras palavras, se x um n qualquer ento
y->chave
x->chave z->chave
Exerccios 1
1. Importante! Escreva uma funo que decida se uma dada rvore binria ou
no de busca.
2. Suponha que x->esq->chave x->chave x->dir->chave para cada n x
de uma rvore binria. Essa rvore de busca?
Busca
No pior caso, a busca consome tempo proporcional altura da rvore. Se a rvore for
balanceada. o consumo ser proporcional a log n, sendo n o nmero de ns. Compare
isso com a busca binria num vetor ordenado.
Exerccios 2
1. Escreva uma funo min que encontre uma chave mnima em uma rvore de
busca. Escreva uma funo max que encontre uma chave mxima.
2. Suponha que as chaves de nossa rvore de busca so distintas duas a duas.
Escreva uma funo que receba uma chave k e devolva a chave seguinte na
ordem crescente.
3. Escreva uma funo que transforme um vetor crescente em uma rvore de busca
balanceada.
4. Escreva uma funo que transforme uma rvore de busca em um vetor crescente.
Comece por alocar dinamicamente o vetor.
5. H uma relao muito ntima entre rvores de busca e o algoritmo de busca
binria num vetor. Qual , exatamente, essa relao?
Insero
Considere o seguinte problema: Inserir um novo n em uma rvore de busca. claro
que a rvore resultante deve tambm ser de busca; a que est a dificuldade do
problema.
A funo abaixo insere o novo n na rvore de busca r. O novo n ser uma folha da
rvore e o endereo da nova rvore ser igual a r a menos que r seja NULL.
//
//
//
//
//
Exerccios 3
1. Escreva uma verso recursiva de insere.
Remoo
Problema: Remover um n de uma rvore de busca de tal forma que a rvore continue
sendo de busca.
Comecemos tratando do caso em que o n a ser removido a raiz da rvore. Se a raiz
no tem um dos filhos, basta que o outro filho assuma o papel de raiz. Seno, faa com
que o n anterior raiz na ordem e-r-d assuma o papel de raiz.
Suponha agora que queremos remover um n que no a raiz da rvore. Para remover o
filho esquerdo de um n x faa
x->esq = removeraiz( x->esq);
Exerccios 4
1. Suponha que as chaves 50, 30, 70, 20, 40, 60, 80, 15, 25, 35, 45, 36 so
inseridas, nesta ordem, numa rvore de busca inicialmente vazia. Desenhe a
rvore que resulta. Em seguida remova o n que contm 30.
2. Escreva uma verso recursiva da funo que remove um n de uma rvore de
busca.