Você está na página 1de 7

Estruturas de Informao ----- rvores Binrias de Pesquisa _____________________________________________________________________________________

RVORES BINRIAS DE PESQUISA rvores binrias de pesquisa so uma estrutura alternativa do tipo rvore
binria, para guardar valores de tal forma que a recuperao dos mesmos pode ser efectuada de forma ordenada. Assim, cada n interno de uma rvore binria de pesquisa obedece aos seguintes critrios: Cada elemento tem uma chave, no existem chaves repetidas As chaves da subrvore esquerda (tambm rvore binria de pesquisa), de um qualquer n considerado como raiz, so menores do que a chave dessa raiz - As chaves da subrvore direita (tambm rvore binria de pesquisa), de um qualquer n considerado como raiz, so maiores do que a chave dessa raiz Abaixo representa-se uma rvore binria de pesquisa de inteiros. Nessa rvore cada n conter, alm dos dois apontadores respectivamente para a subrvore esquerda e subrvore direita, um campo informao, designado por info e que no exemplo ao mesmo tempo a chave.

Como se v cada um dos ns internos segue os critrios anteriormente enunciados. Verificamos tambm que se percorrermos uma rvore deste tipo, utilizando uma visita simtrica, obteremos os valores das chaves ordenados de forma crescente. Assim a rvore acima representada dar origem seguinte lista de valores: 60 70 75 80 85 90 95. Seguidamente desenvolveremos os algoritmos de manipulao deste tipo de estrutura, nomeadamente, o pesquisar, o inserir novo n e eliminar um determinado n dado pela chave. evidente que os dois ltimos algoritmos faro alteraes rvore , mas a nossa estrutura ter-se- que manter binria de pesquisa

_____________________________________________________________________________________ Departamento de Eng Informtica do ISEP 1

Estruturas de Informao ----- rvores Binrias de Pesquisa _____________________________________________________________________________________

Algoritmo de PESQUISA Pretende-se devolver o valor verdadeiro ou falso conforme se encontre ou no o n com a chave que levada como parmetro. Pesquisa(chave) temp=raiz enc=1 // flag que indica se o valor k foi ou no encontrado Enquanto(temp !=Nulo e enc==1) Se (temp->info > chave) Ento //pesquisa na subrvore esquerda temp=temp->esq Seno Se (temp->info<chave) Ento //pesquisa na subrvore direita temp=temp->dir Seno // o contedo do n a nossa chave Enc==0 Fse Fse Fenquanto Se(enc==1) Ento devolve falso Seno devolve verdade Fse Fpesquisa Nesta estrutura as operaes de pesquisa, juntar n e eliminar n sero de complexidade temporal O(log 2 n) , e no caso menos favorvel (rvore completamente desequilibrada, s com ramos direitos ou s com ramos esquerdos) de O(n). Como se verifica pelo algoritmo de pesquisa o nmero de comparaes que no mximo se faz at se concluir que existe ou no a chave, no mximo a altura da rvore. Se a rvore for (mais ou menos )equilibrada, os ns folha todos com a mesma profundidade, podemos relacionar a altura h da rvore ,com o total de elementos n. Assim, n=2 h+1 - 1, ou seja, 2 h+1 = n + 1 h+1 = log 2 (n+1) h = log 2 (n+1) -1, assim podemos dizer que para todos os valores de n > =1, possvel encontrar uma constante C, tal que:

_____________________________________________________________________________________ Departamento de Eng Informtica do ISEP 2

Estruturas de Informao ----- rvores Binrias de Pesquisa _____________________________________________________________________________________

log 2 (n+1) -1< = C * log 2 n , portanto o tempo de complexidade temporal do algoritmo de pesquisa de ordem log 2 n. Para juntar um n a uma rvore binria de pesquisa, fazemo-lo juntando esse n a uma folha. Teremos que fazer uma pesquisa at atingirmos uma folha (caso a chave de pesquisa no exista). No caminho, desde a raiz at folha, viramos para a subrvore esquerda ou direita conforme o valor da chave do n a inserir menor ou maior do que o valor da chave do n que estamos a comparar na descida. Abaixo encontra-se um algoritmo iterativo para juntar o n com chave ch, passado como parmetro Juntar-no (ch) temp=raiz anterior=Nulo enc=1 // flag que indica se o valor k foi ou no encontrado Enquanto(temp !=Nulo e enc==1) Se (temp->info > ch) Ento //pesquisa na subrvore esquerda anterior=temp temp=temp->esq Seno Se (temp->info<chave) Ento //pesquisa na subrvore direita anterior=temp temp=temp->dir Seno // o contedo do n a nossa chave Enc==0 Fse Fse Fenquanto Se(enc==1) Ento // aloca-se espao para o novoNo , coloca-se o contedo e os ponteiros esq e dir sero nulos, idto feito pela funo cria_no novoNo=cria_no Se (anterior=Nulo) //significa que a rvore era nula Ento raiz=novoNo Seno //verifica-se se o novo no vai ficar do lado esquerdo ou direito da folha Se (anterior->info >ch) Ento anterior->esq=novoNo Seno anterior->dir=novoNo Fse Fse
_____________________________________________________________________________________ Departamento de Eng Informtica do ISEP 3

Estruturas de Informao ----- rvores Binrias de Pesquisa _____________________________________________________________________________________

Fse FJuntar_no Este algoritmo poderia ser substitudo por um algoritmo recursivo que deixamos como exerccio. Se rvore que anteriormente representamos pretendssemos juntar o n com a chave 73, obtermos a seguinte nova rvore:

Para criarmos uma rvore binria de pesquisa a partir da rvore nula teremos que invocar o Juntar-no sucessivamente. Para eliminarmos um n de uma rvore binria de pesquisa, comearemos por procurar o n ento vrios casos podem acontecer. O n a eliminar : 1. Folha (no tem as duas subrvores) 2. Falta-lhe uma das subrvores 3. Contem as duas subrvores. O caso 1 e 2 so facilmente resolvidos basta ajustar o apontador, do n anterior (n pai) que aponta para o n que pretendemos eliminar. Fixamos o valor do apontador para o n anterior quando efectuamos a pesquisa do n a eliminar. O caso 3, como facilmente se verifica ,torna-se mais complicado, se eliminssemos esse n ficvamos com duas subrvores no sabendo onde as colocar. Seria o caso de eliminar o n 90 na rvore abaixo desenhada

_____________________________________________________________________________________ Departamento de Eng Informtica do ISEP 4

Estruturas de Informao ----- rvores Binrias de Pesquisa _____________________________________________________________________________________

Assim, no se faz a eliminao desse n, mas substitui-se o contedo do n pelo contedo do n imediatamente anterior em ordem simtrica e elimina-se este ltimo, uma vez que este j no tem a subrvore direita. A rvore assim mantem-se binria de pesquisa. Efectivamente o n imediatamente anterior em ordem simtrica, o n que se encontra na subrvore esquerda do n a eliminar (todas chaves so menores), o mais direita possvel (dos menores o maior). No exemplo acima ser o n 89

Outra possibilidade seria a substituio do n a eliminar pelo imediatamente seguinte em ordem simtrica seguida da eliminao deste ltimo. Neste caso teramos para substituir o contedo dos ns procurar na subrvore direita do n a eliminar, o que se encontra o mais esquerda possvel.
_____________________________________________________________________________________ Departamento de Eng Informtica do ISEP 5

Estruturas de Informao ----- rvores Binrias de Pesquisa _____________________________________________________________________________________

No algoritmo que apresentamos a seguir para evitarmos vrios Ses limitamo-nos a verificar se o n a eliminar no tem a subrvore esquerda e nesse caso ajustamos o apontador do n pai, caso contrrio segue a regra do caso 3 (substituio do contedo). Eliminar-no (ch) temp=raiz anterior=Nulo enc=1 // flag que indica se o valor ch foi ou no encontrado Enquanto(temp !=Nulo e enc==1) Se (temp->info > ch) Ento //pesquisa na subrvore esquerda anterior=temp temp=temp->esq Seno Se (temp->info<chave) Ento //pesquisa na subrvore direita anterior=temp temp=temp->dir Seno // o contedo do n a nossa chave Enc==0 Fse Fse Fenquanto // termina a pesquisa Se(enc==0) // temp aponta para o n a eliminar e anterior para o pai deste Ento // verifica se no tem subrvore esquerda Se (temp->esq==Nulo) Ento // verifica se raiz Se (anterior==Nulo) Ento temp=temp->dir liberta raiz raiz=temp Seno // ajusta o apontador esquerdo ou direito do pai Se (anterior->info < ch) Ento anterior->dir=temp->dir Seno anterior->esq=temp->dir Fse liberta temp Fse Seno // vamos encontrar o n do filho esquerdo que est + direita filhoesq=temp->esq nodir=filhoesq->dir Se (nodir=Nulo)
_____________________________________________________________________________________ Departamento de Eng Informtica do ISEP 6

Estruturas de Informao ----- rvores Binrias de Pesquisa _____________________________________________________________________________________

Ento // troca contedos e ajusta apontador temp->info=filhoesq->info temp->esq=filhoesq->esq liberta filhoesq Seno //descer direita ant=filhoesq Enquanto(nodir->dir =!= Nulo) ant=nodir nodir=nodir->dir Fenquanto //troca contedos e ajusta apontador temp->info=nodir->info ant->dir=nodir->esq liberta nodir Fse Fse Seno Escreve(No existe o n a eliminar) Fse Feliminar_no Tal como o nome indica este tipo de estrutura muito utilizada em pesquisas, nomeadamente em tabelas de smbolos de compiladores e "assemblers" e em diferentes aplicaes de bases de dados. Claro que pode ocasionalmente acontecer, devido forma aleatria de inserir elementos e o retirar que conduza a tempos de resposta um pouco demorados, basta que a rvore se apresente desequilibrada. Este contratempo eliminado com o uso de rvores equilibradas que sero estudadas posteriormente.

_____________________________________________________________________________________ Departamento de Eng Informtica do ISEP 7