【发布时间】:2020-12-22 18:43:43
【问题描述】:
Haskell 初学者在这里:二叉树的中序遍历很简单,例如:
data IntegerTree = Leaf Integer
| Node IntegerTree Integer IntegerTree
inorder :: IntegerTree -> [Integer]
inorder (Leaf n) = [n]
inorder (Node l n r) = inorder l ++ [n] ++ inorder r
但是,在我看来,必须有一个更有效的实现。由于列表是单链接的,连接inorder l 和[n] 似乎很浪费,特别是因为对于一棵大树执行了多次此操作。我可以通过不同的方式编写相同的函数来避免这个问题吗?
我最初在尝试解决以类似方式构建移动列表的河内塔谜题时想到了这一点,我希望可以使用类似的递归算法来解决许多问题。
【问题讨论】:
-
除了严重左偏的树之外,我认为
inorder l ++ (n : inorder r)将大大有助于避免(++)的最坏情况行为。 -
据我所知,
ghc总是将l ++ [x] ++ r优化为l ++ x:r,即使是-O0,所以我已经养成了写前者的习惯,因为它通常更容易阅读。
标签: haskell binary-tree