的较大的分支。如果我有数据类型:树
data Tree t = Leaf | Branch t t
我怎样才能让一个函数来获取一棵树的最长的分支?我想在列表中得到答案,该列表包含从根到树叶的最长分支节点的所有值。事情是这样的:
longestBranch :: (Tree a) -> [a]
什么建议吗? 谢谢。
的较大的分支。如果我有数据类型:树
data Tree t = Leaf | Branch t t
我怎样才能让一个函数来获取一棵树的最长的分支?我想在列表中得到答案,该列表包含从根到树叶的最长分支节点的所有值。事情是这样的:
longestBranch :: (Tree a) -> [a]
什么建议吗? 谢谢。
As amalloy noted你目前在你的问题的类型不是树:
data Tree t = Leaf | Branch t t
这是同构的Maybe (t,t)
- 它要么包含两个t
值,或什么都没有。
两种最常见的二叉树,人们定义要么值的分支:
A
/ \
B C
/\ /\
D * * E
/\ /\
* F * G
/\ /\
* * * *
,或者在叶子:
*
/ \
* *
/\ /\
* 3 4 *
/\ /\
0 * 5 *
/\ /\
1 2 6 7
既然你正在寻找的东西,“包含所有从根到树叶的最长分支的节点 的值“,我假设你正在为前者寻找 。
此数据类型可被定义为:
data Tree t = Leaf | Branch (Tree t) t (Tree t)
甲Leaf
是一个高度-0树。 A Branch
包含两个子树和一个值。
longestBranch Leaf = _
longestBranch (Branch left value right) =
let longestLeft = longestBranch left
longestRight = longestBranch right
in _
现在对于一些引导性问题:
,看着所需功能的类型
longestBranch :: Tree a -> [a]
我们可以通过类型把它分解为两种情况
从Leaf
开始的最长分支是什么?
鉴于longestLeft
对于left
子树最长的分支, 即longestRight
是为right
子树最长的分支,你能 确定Branch left value right
最长的分支是什么?
[SPOILER]一旦你解决了这个版本,你应该能够通过跟踪自己的列表长度来提高性能。 – HTNW
你试过了什么?你卡在哪里?你能用另一种语言实现算法吗?或者这也会成为一个问题? – epsilonhalbe
另请注意,您定义的类型不是树。 – amalloy
@moondaisy问题中的类型至少是合法类型!你的“树”没有提供足够的类型参数。 – amalloy