如果我有数据类型:
data Tree t = Leaf | Branch t t
如何创建一个函数来获取树的最长分支?我想在列表中得到答案,其中包含最长分支的节点的所有值,从根到叶。像这样:
longestBranch :: (Tree a) -> [a]
有什么建议吗? 感谢。
答案 0 :(得分:4)
constructor of std::vector
您目前在问题中所拥有的类型不是树:
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的树。 Branch
包含两个子树和一个值。
现在,查看所需功能的类型
longestBranch :: Tree a -> [a]
我们可以通过以下类型分解为两种情况:
longestBranch Leaf = _
longestBranch (Branch left value right) =
let longestLeft = longestBranch left
longestRight = longestBranch right
in _
现在提出一些主要问题:
从Leaf
开始的最长分支是什么?
鉴于longestLeft
是left
子树的最长分支,并且
那个longestRight
是right
子树的最长分支,你能吗?
确定Branch left value right
的最长分支是什么?