一棵树的更大的分支

时间:2017-10-17 23:31:14

标签: list haskell tree nodes

如果我有数据类型:

data Tree t = Leaf | Branch t t

如何创建一个函数来获取树的最长分支?我想在列表中得到答案,其中包含最长分支的节点的所有值,从根到叶。像这样:

longestBranch :: (Tree a) -> [a]

有什么建议吗? 感谢。

1 个答案:

答案 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开始的最长分支是什么?

  • 鉴于longestLeftleft子树的最长分支,并且 那个longestRightright子树的最长分支,你能吗? 确定Branch left value right的最长分支是什么?