【问题标题】:How to check if my binary search Tree is complete? (Haskell)如何检查我的二叉搜索树是否完整? (哈斯克尔)
【发布时间】:2019-01-18 21:30:55
【问题描述】:
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)

如何检查树是否完整?

【问题讨论】:

  • 你的 isPerfect 函数对我来说看起来不对。如果t 是深度为 1 的完美树,u 是深度为 2 的完美树,isPerfect (Node x t u) 应该是什么?
  • valid functioncontainerSet 类型对您来说应该很有趣。

标签: haskell binary-search-tree


【解决方案1】:

您只需要添加一个案例:

isPerfect (Node _ lt Nil ) = False

isComplete 中仍然有效,但前提是lt 没有子级。

isComplete (Node _ (Node _ Nil Nil) Nil) = True

【讨论】:

    【解决方案2】:

    我相信您正在尝试使这个问题变得比可能的简单一点。要检查二叉树是否完美,您不仅需要知道两个孩子都是完美的,还需要知道它们的深度相同。所以知道isPerfect对孩子的递归结果仍然不足以回答这个问题。

    这在编写递归函数时经常出现。你需要编写一个递归函数来做一些比你想要的强大的事情,然后从中提取你想要的信息。你可以从这个开始,例如:

    -- | Gives the depth of a tree if it's perfect;
    -- or otherwise, Nothing
    perfectDepth :: BTree a -> Maybe Int
    perfectDepth Nil = Just 0
    perfectDepth (Node x a b) =
        case (perfectDepth a, perfectDepth b) of
            (Just da, Just db) | da == db -> Just (da + 1)
            _ -> Nothing
    

    (这也不是一个理想的实现。当您已经知道深度错误时,您可能会在b 方面做大量工作来验证完美性。但它确实有效,我在这里选择了简单而不是效率.)

    既然您的递归为您提供了正确的信息,那么您应该可以写成isPerfectisComplete 会使用类似的策略。

    【讨论】:

    • 我不相信有任何一种完美的实现。您可以通过某些方式快捷方式,但这会阻止其他快捷方式。特别是,您可以进行深度优先或广度优先。
    • 听起来不错。但是坚持深度优先,您可以通过添加第二个函数hasPerfectDepth :: Int -> BTree a -> Bool 来检查已知深度来做得更好。那么perfectDepth 中的第二个等式变为case perfectDepth a of Just d | hasPerfectDepth d b -> Just d; _ -> Nothing
    • 确实如此。
    猜你喜欢
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多