Я думал о выравнивании двоичного дерева в списке, для последней обработки.Haskell: сгладить двоичное дерево
Сначала я подумал об использовании (++)
, чтобы присоединиться к левым и правым ветвям, но затем подумал, что в худшем случае это займет O(n^2)
раз.
Я подумал о том, чтобы создать список назад, используя (:)
, чтобы добавить к фронту в линейном времени. Однако тогда я подумал, что если я отправлю этот список в функцию, подобную складке, ему придется подождать, пока все дерево не пройдет, прежде чем оно начнет складываться, и, следовательно, не может использовать list fusion.
я тогда придумал following:
data Tree a = Node a (Tree a) (Tree a) | Tip
flatten :: Tree a -> [a]
flatten x = (flatten' x) []
flatten' :: Tree a -> [a] -> [a]
flatten' (Node x left right) l = (flatten' left (x:(flatten' right l)))
flatten' Tip l = l
main =
putStrLn $ show $ flatten $
(Node 2 (Node 1 Tip Tip) (Node 4 (Node 3 Tip Tip) Tip))
Будет ли эта работа в O(n)
время, взять «пространство стека» не больше, чем пропорционально наибольшей глубине дерева и она может быть слит с огнь функция (т. е. исключен промежуточный список)? Это «правильный» способ сгладить дерево?
http://hackage.haskell.org/packages/archive/containers/latest/doc/html/src/Data-Map-Base.html#foldl –
Как указывает luqui, это метод списка разностей. [this] (http://stackoverflow.com/a/10584256/849891) и [this] (http://stackoverflow.com/a/9550430/849891) также связаны. –