List 大树枝
如果我有数据类型:List 大树枝,list,haskell,tree,nodes,List,Haskell,Tree,Nodes,如果我有数据类型: data Tree t = Leaf | Branch t t 如何生成一个函数来获取树的最长分支?我想在一个列表中得到答案,该列表包含从根到叶的最长分支节点的所有值。大概是这样的: longestBranch :: (Tree a) -> [a] 有什么建议吗? 谢谢。您当前的问题类型不是树: data Tree t = Leaf | Branch t t 这与可能(t,t)同构-它要么包含两个t值,要么什么都没有 人们定义的两种最常见的二叉树在分支处都有值:
data Tree t = Leaf | Branch t t
如何生成一个函数来获取树的最长分支?我想在一个列表中得到答案,该列表包含从根到叶的最长分支节点的所有值。大概是这样的:
longestBranch :: (Tree a) -> [a]
有什么建议吗?
谢谢。您当前的问题类型不是树:
data Tree t = Leaf | Branch t t
这与可能(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的树。分支包含两个子树和一个值
现在,看看所需函数的类型
longestBranch :: Tree a -> [a]
我们可以按类型将其分为两种情况:
longestBranch Leaf = _
longestBranch (Branch left value right) =
let longestLeft = longestBranch left
longestRight = longestBranch right
in _
下面是一些主要问题:
- 从
叶开始的最长分支是什么
- 假设
是longestLeft
子树的最长分支,并且 那left
是longestRight
子树的最长分支,可以吗 确定右
分支左值右的最长分支是什么
data Tree t = Leaf | Branch t t
这与可能(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的树。分支包含两个子树和一个值
现在,看看所需函数的类型
longestBranch :: Tree a -> [a]
我们可以按类型将其分为两种情况:
longestBranch Leaf = _
longestBranch (Branch left value right) =
let longestLeft = longestBranch left
longestRight = longestBranch right
in _
下面是一些主要问题:
- 从
叶开始的最长分支是什么
- 假设
是longestLeft
子树的最长分支,并且 那left
是longestRight
子树的最长分支,可以吗 确定右
分支左值右的最长分支是什么
Tree
提供足够的类型参数。您可能需要data Tree t=Leaf | Branch(Tree t)t(Tree t)
。使用data Tree t=Leaf | Branch(Tree t)(Tree t)
你的问题实际上不起作用(除非你的意思是得到一个元素列表,所有元素在最大深度上都相同)。你试过什么?你被困在哪里?您能用另一种语言实现该算法吗?或者这也是一个问题?请注意,您定义的类型不是树。@moondaisy至少问题中的类型是合法类型!您的没有为Tree
提供足够的类型参数。您可能需要data Tree t=Leaf | Branch(Tree t)t(Tree t)
。使用data Tree t=Leaf | Branch(Tree t)(Tree t)
你的问题实际上不起作用(除非你想得到一个元素列表,所有元素在最大深度上都是相同的)。[SPOILER]一旦你解决了这个版本,你应该能够通过自己跟踪列表的长度来提高性能。[SPOILER]一旦您解决了这个版本,您应该能够通过自己跟踪列表的长度来提高性能。