【问题标题】:haskell create an unbalanced treehaskell 创建一个不平衡的树
【发布时间】:2015-12-11 04:44:50
【问题描述】:

我的树定义是

data Tree = Leaf Integer | Node Tree Tree

这是一棵二叉树,只有叶子的值。 我得到以下平衡树的定义:

如果每个节点的左右子树的叶子数最多相差一个,我们就说一棵树是平衡的,叶子本身是平凡平衡的。

我尝试如下创建平衡树:

t :: Tree

t = Node (Node (Node (Leaf 1) (Leaf 2)) (Node(Leaf 3)(Leaf 4))) (Node (Node (Leaf 5) (Leaf 6)) (Node (Leaf 7) (Leaf 8)) )

你能告诉我上面的 t 是否是一棵仅在叶子上具有值的平衡树吗?

另一个问题,我如何创建另一棵树,其值仅在叶子上,并且根据上述定义它是不平衡的。

谢谢

【问题讨论】:

  • 第二个问题:你能一棵不平衡的树吗?

标签: haskell tree


【解决方案1】:

您能否告诉我上面的t 是否是一棵仅在叶子上具有值的平衡树?

我可以,但我不会。不过,我希望我能指导您完成编写一个函数来确定给定树是否平衡的过程。

以下当然不是最有效的方法(请参阅底部的提示),但它是一种非常模块化的方法。这也是函数式编程(尤其是惰性函数式编程)鼓励的“通过转换计算”方法的一个很好的例子。对我来说似乎很清楚,要问的第一个问题是“每个节点有多少叶子?”我们无法直接在树中写下答案,但我们可以创建一个有答案的新树:

data CountedTree = CLeaf Integer | CNode Integer Tree Tree

CountedTree 的每个节点都有一个整数字段,指示有多少叶子从它下降。

您应该能够编写一个函数来读取来自CountedTree(无论是Leaf 还是Node)的叶子总数:

getSize :: CountedTree -> Integer

下一步是确定CountedTree 是否平衡。这是一个骨架:

countedBalanced :: CountedTree -> Bool
countedBalanced CLeaf = ?
countedBalanced (CNode _ left right)
  = ?? && ?? && getSize left == getSize right

我将第一步留到最后:将Tree 转换为CountedTree

countTree :: Tree -> CountedTree

最后你可以把它包起来了:​​

balanced :: Tree -> Bool
balanced t = ?? (?? t)

现在事实证明,您实际上不必复制和注释树来确定它是否平衡。你可以更直接地做到这一点。这是一种更高效 的方法,但模块化 方法稍微少一些。我给你相关类型,你可以填写函数。

-- The balance status of a tree. Either it's
-- unbalanced, or it's balanced and we store
-- its total number of leaves.
data Balance = Unbalanced | Balanced Integer

getBalance :: Tree -> Balance

【讨论】:

  • 这个答案不包含单子教程。已批准。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-07
  • 2014-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-26
相关资源
最近更新 更多