【问题标题】:Perfect and Complete trees for a general tree. (Haskell)一般树的完美和完整树。 (哈斯克尔)
【发布时间】:2018-08-12 14:54:32
【问题描述】:
data BTree a = Nil | Node a (BTree a) (BTree a) deriving Show

我了解了两种二叉搜索树。一个是完美的,另一个是完整的。

二叉树是完美二叉树,其中所有内部节点都有两个孩子,并且所有叶子都在同一级别。

二叉树是完整的二叉树,如果所有层都被完全填满,除了可能的最后一层并且最后一层的所有键都尽可能离开

isPerfect :: BTree a -> Bool
isPerfect Nil = True
isPerfect (Node x Nil Nil) = True
isPerfect (Node x lt Nil ) = False
isPerfect (Node x Nil rt ) = False
isPerfect (Node x lt  rt ) = (&&) (isPerfect lt) (isPerfect rt)


isComplete :: BTree a -> Bool
isComplete Nil = True
isComplete (Node x Nil Nil) = True
isComplete (Node _ lt Nil ) = False
isComplete (Node x Nil rt ) = False
isComplete (Node _ (Node _ Nil Nil) Nil) = True
isComplete (Node x lt  rt ) = (&&) (isComplete lt) (isComplete rt)

现在我必须为通用树实现一种数据类型

data GTree a = Leaf a | Branch a [GTree a] deriving (Show)

如何检查这棵树是否完整或完美,是否必须更改定义?

提前致谢

【问题讨论】:

  • isPerfect 不检查是否所有叶子都在同一级别。
  • question 的副本,目前没有正确答案。
  • @chi,我不认为是完全重复的。
  • 我看到的唯一区别是这里我们使用通用树——也许这足以让它与众不同。 (这个问题也是从isPerfectisComplete的错误实现开始的。)

标签: haskell binary-tree


【解决方案1】:

首先,让我们坚持使用二叉树。考虑以下二叉树:

  1
 / \
2   3
   / \
  4   5

可以表示为:

badTree = Node 1 (Node 2 Nil Nil) (Node 3 (Node 4 Nil Nil) (Node 5 Nil Nil))

这棵树既不完美也不完整,但你的函数说它是:

> isPerfect badTree
True
> isComplete badTree
True
> 

所以,看来你还有一些工作要做。

其次,要将其概括为“通用树”,是的,您需要修改定义。考虑所有叶子都在同一级别(对每个节点的子节点数量没有要求)或所有叶子都在同一级别每个内部的一般树的子集是合理的节点具有相同数量的子节点(例如 2、3 或 4)或具有至少两个子节点或其他。但是,我不知道“完美”或“完整”一般树的普遍接受定义,所以你会在进行过程中进行编造。

第三,值得指出的是,您的 GTree 实现可能并不理想。通常一个“叶子”是一个没有子节点的节点,但是你有两种方式来表示一个没有子节点的节点:

Leaf 10
Branch 10 []

这些应该是同一棵树吗?如果是这样,理想情况下不应该有两种不同的表示形式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    • 2019-07-02
    • 2012-12-16
    • 1970-01-01
    • 2019-05-17
    相关资源
    最近更新 更多