我得到了这种类型的定义:
data Tree = Leaf Char | Branch2 Char Tree Tree | Branch3 Char Tree Tree Tree
如何编写一个方法,为我提供树的最大路径长度(计算路径中的节点)?
答案 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))
是吗?对不起,我在递归编程方面不太好。