【发布时间】:2012-01-22 20:36:39
【问题描述】:
我们被要求在 Haskell 中创建一个 2-3-4 树,如写入数据类型、插入函数和显示函数。
我发现很难获得有关这种树的信息,即使使用我熟悉的语言(Java、C++)也是如此。
到目前为止我所拥有的 -
data Tree t = Empty
| Two t (Tree t)(Tree t)
| Three t t (Tree t)(Tree t)(Tree t)
| Four t t t (Tree t)(Tree t)(Tree t)(Tree t) deriving (Eq, Ord, Show)
leaf2 a = Two a Empty Empty
leaf3 a b = Three a b Empty Empty Empty
leaf4 a b c = Four a b c Empty Empty Empty Empty
addNode::(Ord t) => t -> Tree t -> Tree t
addNode t Empty = leaf2 t
addNode x (Two t left right)
| x < t = Two t (addNode x left) right
| otherwise = Two t left (addNode x right)
这可以编译,但我不确定它是否正确,但不确定如何开始将插入写入三节点或四节点。
作业还说,显示功能的“导出显示”是不够的,它应该以通常在图表中看到的格式打印出树。再次,不确定如何去做。
任何帮助或指导表示赞赏。
【问题讨论】:
-
您是否阅读了有关 2-3-4 树的维基百科文章?你了解它对插入算法的描述吗?如果是这样,你能描述一下你在 Haskell 中尝试实现它的确切位置吗?如果没有,请说明您不明白的部分。
-
哦,关于 Show 实例:你知道如何在 Haskell 中定义实例吗?你知道你的树的显示功能应该是什么样子吗?您在尝试实施时遇到了什么问题?
-
另外,请查看the
drawTreefunction in the standard Data.Tree module,并考虑如何使其适应您的类型。 -
我承认,维基百科的文章看起来确实很混乱。文章中链接的参考资料之一可能会让您的运气更好。
-
此时我遇到的主要问题是插入到 4 节点。由于我无法返回树,因此我需要提前检查下一个节点是否为 4 节点,以便保留数据以拆分节点。