【问题标题】:Can this implementation of in-order traversal of a binary tree be improved?这种按顺序遍历二叉树的实现可以改进吗?
【发布时间】:2016-03-06 19:01:53
【问题描述】:

我为二叉树编写了一个简单的中序遍历函数 (toList1)。但是,我担心它的复杂性(内存/时间)。有没有更好的实现方式?

data Tree a = Empty | Node a (Tree a) (Tree a) 
toList1 :: (Tree a) -> [a]
toList1 Empty = []
toList1 (Node x lx rx) = (toList lx) ++ [x] ++ (toList rx)

【问题讨论】:

标签: haskell binary-tree inorder


【解决方案1】:

Haskell 的追加 ++ 在其左参数的长度上线性执行,这意味着如果树向左倾斜,您可能会获得 二次 性能。 一种可能性是使用difference list

另一种方法是定义一个Foldable 实例:

data Tree a = Empty | Node a (Tree a) (Tree a)

instance Foldable Tree where
    foldr f z Empty = z
    foldr f z (Node a l r) = foldr f (f a (foldr f z r)) l

那么,有序遍历自然就出来了:

toList :: Tree a -> [a]
toList = foldr (:) []

\> let tr = Node "root" (Node "left" Empty Empty) (Node "right" Empty Empty)
\> toList tr
["left","root","right"]

【讨论】:

  • 我不确定我是否正确理解了您。对于完美平衡树,我的算法是线性的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 2020-12-12
  • 1970-01-01
相关资源
最近更新 更多