2.1) 1.0 ponto sum2tips (Tip a) = (Tip a) sum2tips (Bin (Tip a) (Tip b)) = Tip (a+b) sum2tips (Bin a b) = Bin (sum2tips a) (sum2tips b) 2.2) 1.0 ponto sumtree (Tip t) = t sumtree (Bin t1 t2) = sumtree (sum2tips (Bin t1 t2)) 2.3) 0.5 ponto ziptree (Tip a) (Tip b) = Tip (a,b) ziptree (Bin t1 t2) (Bin t3 t4) = Bin (ziptree t1 t3) (ziptree t2 t4) 3.1) 1.0 ponto direto a (No b gs) | a == b = map vals gs | otherwise = concat (map (direto a) gs) vals (No a gs) = a 3.2) 1.0 ponto indir a (No b gs) | a == b = concat (map todos gs) | otherwise = concat (map (indir a) gs) todos (No b gs) = b : concat (map todos gs) 3.3) 1.0 ponto gtol (No b gs) = map (pair b) gs ++ concat (map gtol gs) where pair x (No b gs) = (x,b) 4.1) 0.5 ponto fliptree (Tip a) = Tip a fliptree (Bin t1 t2) = Bin (fliptree t2) (fliptree t1) 4.2) 1.0 ponto caso xs = Tip a: fliptree (fliptree (Tip a)) = fliptree (Tip a) = Tip a caso xs = Bin t1 t2, hipoteses de inducao: fliptree (fliptree t1) = t1 e fliptree (fliptree t2) = t2 fliptree (fliptree (Bin t1 t2)) = fliptree (Bin (fliptree t2) (fliptree t1)) = Bin (fliptree (fliptree t1)) (fliptree (fliptree t2)) = Bin t1 t2 5) 1.5 ponto enum arvore = en 1 arvore where en n (Tip a) = Tip (n,a) en n (Bin t1 t2) = Bin (en n t1) (en (n+size t1) t2) (existem solucoes melhores para esta ultima questao, atravessando a arvore uma unica vez (i.e sem usar size), mas a solucao acima e' bem simples)