【发布时间】:2012-05-15 01:02:37
【问题描述】:
我正在考虑将二叉树展平为列表,以供以后处理。
我一开始想用(++)来连接左右分支,但后来想到更糟糕的情况会花费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) 时间内工作,占用“堆栈空间”不超过与树的最大深度成比例,并且可以与消耗函数融合(即消除中间列表)?这是把树弄平的“正确”方法吗?
【问题讨论】:
标签: algorithm haskell tree binary-tree difference-lists