luchhozito Posted January 6, 2010 at 03:06 PM Report Share #304471 Posted January 6, 2010 at 03:06 PM eu tenho uma lista ordenada por ordem crescente. Queria construir uma árvore binária de procura. Mas não estou a conseguir. montarA :: [int] -> Abin Int montarA [] = Vazia montarA [x] = (No x Vazia Vazia) montarA (x:xs) = ... Link to comment Share on other sites More sharing options...
Baderous Posted January 6, 2010 at 03:38 PM Report Share #304487 Posted January 6, 2010 at 03:38 PM Define uma função auxiliar que, dada uma árvore e um elemento, insere o elemento na árvore. Depois noutra função apenas tens de percorrer a lista, e inserir cada elemento numa árvore que inicialmente está Vazia, usando a função auxiliar, e vais construindo a árvore (usa o foldr/foldl). Link to comment Share on other sites More sharing options...
luchhozito Posted January 6, 2010 at 03:58 PM Author Report Share #304493 Posted January 6, 2010 at 03:58 PM Define uma função auxiliar que, dada uma árvore e um elemento, insere o elemento na árvore. Depois noutra função apenas tens de percorrer a lista, e inserir cada elemento numa árvore que inicialmente está Vazia, usando a função auxiliar, e vais construindo a árvore (usa o foldr/foldl). foldr e foldl não me ageito. vou tentar Link to comment Share on other sites More sharing options...
luchhozito Posted January 6, 2010 at 04:13 PM Author Report Share #304498 Posted January 6, 2010 at 04:13 PM insereAux :: Int -> ABin Int -> ABin Int insereAux x Vazia = (No x Vazia Vazia) insereAux n (No x esq dir) | (n == x) = (No x esq dir) | (n < x) = No x (insereAux n esq) dir | (n > x) = No x dir (insereAux n esq) montar :: [int] -> ABin Int -> ABin Int montar [] Vazia = Vazia montar [x] Vazia = No x Vazia Vazia montar (x:xs) a@(Vazia) = insereAux x a Agora só não sei como a recursividade na função montar ao xs :bored: Link to comment Share on other sites More sharing options...
Baderous Posted January 6, 2010 at 04:19 PM Report Share #304501 Posted January 6, 2010 at 04:19 PM montar :: [int] -> ABin Int -> ABin Int montar [] x = x montar xs a = foldl (\x y -> insereAux y x) a xs criaArvore :: [int] -> ABin Int criaArvore lista = montar lista Vazia O foldl é que vai construir a árvore (inicialmente Vazia, como indicado na função criaArvore) com os sucessivos valores da lista. Link to comment Share on other sites More sharing options...
Rui Carlos Posted January 8, 2010 at 02:13 PM Report Share #304784 Posted January 8, 2010 at 02:13 PM Essa abordagem não é muito boa, pois não tira partido da lista já estar ordenada, e, pior do que isso, constrói uma árvore que pouco mais será do que uma lista (os elementos serão sempre inseridos na extremidade mais à direita, resultando numa árvore sem qualquer ramificação). Em vez disso, penso que devias criar uma função que selecciona o elemento do meio da lista para raiz da árvore, e constrói as sub-árvores chamando recursivamente a função, com os elementos da direita e da esquerda como argumento. Rui Carlos Gonçalves Link to comment Share on other sites More sharing options...
Baderous Posted January 8, 2010 at 07:50 PM Report Share #304876 Posted January 8, 2010 at 07:50 PM Bem visto. Link to comment Share on other sites More sharing options...
luchhozito Posted January 8, 2010 at 11:33 PM Author Report Share #304927 Posted January 8, 2010 at 11:33 PM Essa abordagem não é muito boa, pois não tira partido da lista já estar ordenada, e, pior do que isso, constrói uma árvore que pouco mais será do que uma lista (os elementos serão sempre inseridos na extremidade mais à direita, resultando numa árvore sem qualquer ramificação). Em vez disso, penso que devias criar uma função que selecciona o elemento do meio da lista para raiz da árvore, e constrói as sub-árvores chamando recursivamente a função, com os elementos da direita e da esquerda como argumento. vou tentar fazer isso Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now