Haskell中的最大树深度

时间:2014-01-20 16:32:07

标签: haskell recursion tree

我得到了这种类型的定义:

data Tree = Leaf Char | Branch2 Char Tree Tree | Branch3 Char Tree Tree Tree

如何编写一个方法,为我提供树的最大路径长度(计算路径中的节点)?

4 个答案:

答案 0 :(得分:2)

您可能希望编写一个递归函数来执行此操作。对于每个Tree构造函数,您需要在函数中使用不同的大小写。首先,您知道任何Leaf的深度为1,所以

maxDepth :: Tree -> Int
maxDepth (Leaf _) = 1
maxDepth (Branch2 c left right) = maximum [???]
maxDepth (Branch3 c left center right) = maximum [???]

我会让你完成剩下的功能。您也可以采用几种不同的方式(例如使用max代替maximum)。

答案 1 :(得分:1)

lazy corecursive breadth-first tree traversal

treedepth tree = fst $ last queue
  where
    queue = (1,tree) : gen 1 queue

    gen  0   p                        = []
    gen len ((d,Leaf    _      ) : p) = gen (len - 1) p 
    gen len ((d,Branch2 _ l   r) : p) = (d+1,l) : (d+1,r) : gen (len + 1) p 
    gen len ((d,Branch3 _ l c r) : p) = (d+1,l) : (d+1,c) : (d+1,r) : gen (len + ??) p 

将其更改为深度优先遍历会将其转换为常规递归。

答案 2 :(得分:1)

我可能通过使用延续传递来编写尾递归解决方案。

depth :: Tree -> Int
depth t = go t id
 where
  go (Leaf _)          k = k 0
  go (Branch2 _ l r)   k = go l $ \dl -> go r $ \dr -> k (1 + max dl dr)
  go (Branch3 _ l m r) k = go l $ \dl -> go m $ \dm -> go r $ \dr -> k (1 + max dl (max dm dr))

答案 3 :(得分:0)

depth :: Tree -> Int
depth (Leaf _) = 1
depth (Branch2 c left right) = max((depth(left) + 1) (depth(right) + 1))
depth (Branch3 c left center right) = max(max((depth(left) + 1) (depth(right) + 1)) (depth(center) + 1))

是吗?对不起,我在递归编程方面不太好。