2016-06-11 5 views
0

Это мой СНИМИТЕ:Распечатайте бинарное дерево

data BinTree α = Empty 
    | Node (BinTree α) α (BinTree α) 
    deriving (Eq, Show) 

Теперь я хочу, чтобы создать функцию:

levels :: BinTree a -> [[a]] 

Это должно распечатать бинарное дерево в списке, но каждый уровень свой. Для примера: [[1],[2,3],[4,5,6,7]] или

[1] 
[2,3] 
[4,5,6,7] 

...

Я определил roots и childs:

roots ts = [ a | Node _ a _ <- ts ] 
childs ts = [ t | Node l _ r <- ts, t <- [l, r] ] 

и траверс функцию, которая получает список поддерева и его узла.

traverse' :: [BinTree α] -> [α] 
traverse' [] = [] 
traverse' ts = roots ts ++ traverse' (childs ts) 

levels :: BinTree α -> [α] 
levels t = traverse [t] 

Но это не то, что я действительно хотел. У кого-то есть идея.

+0

Попробуйте написать 'f :: BinTree a -> [[a]]', который преобразует двоичное дерево в список списков, в котором первый список содержит корень, второй список - дочерние, следующий - внуки и так далее. После этого ты почти закончил. – ThreeFx

+0

В противном случае посмотрите на [this] (http://stackoverflow.com/questions/12556469/nicely-printing-showing-a-binary-tree-in-haskell?rq=1) вопрос, это может помочь в разработке функция. – ThreeFx

+0

Подумайте о том, как выразить уровни узла в терминах уровней левого и правого дочерних узлов. Вы знакомы с функцией 'zip'? – ErikR

ответ

1

Это прекрасно работает:

f Empty = [] 
f (Node l v r) = case (f l, f r) of 
        ((x:xs),(y:ys)) -> [[v],x++y] ++ (zipWith (++) xs ys) 
        ([],[])   -> [[v]] 
        ...... 

Заполните узоры. (Вы можете проверить это с полным деревом, чтобы быть уверенным, что это хороший старт).