Você está na página 1de 3

Faculdade de Computao Programao Funcional (BCC/BSI) 1 Perodo

Aula Prtica: rvores Binrias


rvores Binrias
As rvores so estruturas de dados baseadas em listas encadeadas que possuem um n superior (raiz) que aponta para outros ns (filhos) que podem ser pais de outros ns. Embora existam muitos tipos de rvores, as rvores binrias so especiais pois, quando ordenadas, conduzem a pesquisas, inseroes e excluses de contedo com eficincia e velocidade. Uma rvore de busca binria tem as propriedades: todos os elementos na subrvore esquerda de um n n so menores que n todos os elementos na subrvore direita de n so maiores ou iguais a n. Veja o caso da da rvore de busca binria abaixo, construda a partir dos nmeros: 14,15, 4, 9, 7, 18, 3, 5, 16, 20, 17.

Se uma rvore de busca binria for percorrida em ordem simtrica (esquerda, raiz, direita) e o contedo de cada n for impresso medida que o n for visitado, os nmeros sero impressos em ordem ascendente. Para a rvore acima o resultado seria: 3 4 5 7 9 14 15 16 17 18 20 Podemos definir um tipo algbrico ArvBinInt em Haskell para armazenar nmeros inteiros numa rvore binria: data ArvBinInt = Nil | NoInt Int ArvBinInt ArvBinInt deriving Show

A definio de ArvBinInt recursiva. Podemos observar que uma rvore composta de um n, identificado por uma etiqueta (NoInt), um elemento inteiro e duas sub-rvores (direita e esquerda). Ainda, a rvore pode ser nula. A constante arvDados representa a rvore binria da figura anterior: arvDados::ArvBinInt arvDados = NoInt 14 (NoInt 4 (NoInt 3 Nil Nil) (NoInt 9 (NoInt 7 (NoInt 5 Nil Nil) Nil) Nil) ) (NoInt 15 Nil (NoInt 18 (NoInt 16 Nil (NoInt 17 Nil Nil)) (NoInt 20 Nil Nil)) ) Funes para Manipulao de rvores: As folhas de uma rvore binria so aqueles ns que no contm filhos nem esquerda, nem direita. A funo abaixo lista os ns folhas de uma rvore binria de inteiros: folhas::ArvBinInt -> [Int] folhas Nil = [] folhas (NoInt n Nil Nil) = [n] folhas (NoInt _ esq dir) = folhas esq ++ folhas dir Para somar os elementos registrados numa rvore binria podemos utilizar a funo abaixo: soma::ArvBinInt -> Int soma Nil = 0 soma (NoInt n Nil Nil) = n soma (NoInt n esq dir) = n + soma esq + soma dir Para verificar se um elemento pertence uma rvore binria temos a seguinte funo: pertenceArv::Int -> ArvBinInt -> Bool pertenceArv x Nil = False pertenceArv x (NoInt v esq dir) = x==v || if x<v then (pertenceArv x esq) else (pertenceArv x dir) A funo emOrdem possibilita percorrer todos os elementos armazenados na rvore binria, segundo o critrio : esquerda n direita emOrdem::ArvBinInt -> [Int] emOrdem Nil = [] emOrdem (NoInt n esq dir) = emOrdem esq ++ [n] ++ emOrdem dir

Exerccios:
1) Defina um tipo algbrico para uma rvore binria de caracteres, e faa em seguida uma funo que retorna uma lista de caracteres com todos os ns da rvore. 2) Defina funes para percorrer uma rvore binria de caracteres usando os critrios prordem (raiz esquerda direita) e ps-ordem (esquerda direita - raiz) 3) Duas rvores binrias so semelhantes se ambas estiverem vazias, ou se forem novazias e suas subrvores esquerdas e subrvores direitas forem semelhantes. Escreva um algoritmo para determinar se duas rvores binrias so semelhantes. 4) Uma rvore binria pode ser utilizada para armazenar expresses aritmticas. Para isso definimos o tipo ArvBinEA em que uma rvore pode ser vazia, conter um valor numrico ou conter uma expresso com um operador e outras duas expresses: data ArvBinEA a = Vazia | Folha a | NoEA (Char, ArvBinEA a, ArvBinEA a) deriving (Show) A partir deste novo tipo podemos definir a expresso: ea::ArvBinEA Float ea = NoEA ('+', NoEA ('*', Folha 10, Folha 5), Folha 7) + *

10

Faa uma funo que receba uma rvore binria de expresso aritmtica e retorne o resultado da expresso. Por exemplo, dada a rvore ea desenhada acima, a funo deve devolver o valor 57.

Você também pode gostar