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
    子树的最长分支,可以吗 确定
    分支左值右的最长分支是什么


您尝试过什么?你被困在哪里?您能用另一种语言实现该算法吗?或者这也是一个问题?请注意,您定义的类型不是树。@moondaisy至少问题中的类型是合法类型!您的没有为
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]一旦您解决了这个版本,您应该能够通过自己跟踪列表的长度来提高性能。