【问题标题】:Binary search tree predicate with helper functions带有辅助函数的二叉搜索树谓词
【发布时间】:2019-10-10 07:04:42
【问题描述】:
data BinaryTree a = Null | Node (BinaryTree a) a (BinaryTree a)
deriving Show

type BSTree a = BinaryTree a

treeBSMax :: (Ord a) => BSTree a -> a
treeBSMax   btree = case btree of
        Null -> error
        Node _ val Null -> val
        Node _ val right -> treeBSMax right

treeBSMin :: (Ord a) => BSTree a -> a
treeBSMin btree = case btree of
       Null -> error
       Node Null val _ -> val
       Node left val _ -> treeBSMax left

isBSTree :: (Ord a) => BinaryTree a -> Bool
isBSTree btree = case btree of
      Null -> False
      Node Null val Null -> True
      Node lt val rt -> val >  treeBSMin lt && val < treeBSMax rt

如何使用treeBSMin 和treeBSMax 作为isBSTree 的辅助函数来判断一棵树是否是二叉搜索树?

【问题讨论】:

  • 为什么需要treeBSMin 和treeBSMax 才能知道它是否是二叉树?您可以递归地工作,每次进一步进入树时都会设置第一个未设置的边界。
  • 问题是我不知道如何递归比较树中的元素。
  • 您只需在递归调用中使用参数,如此答案所示:stackoverflow.com/a/58305672/67579
  • 请注意,在isBSTree 中,您考虑了两个子树都为空且两个子树都为非空的情况。这并不涵盖所有情况,并且会导致最小/最大辅助函数出错。
  • @chi a. “两个子树都是非空的”我没有看到。湾。错误比这严重得多。

标签: haskell tree binary-tree binary-search-tree predicate


【解决方案1】:

要将它们用作辅助函数,您需要首先使用 Maybe 从代码中删除 partiality:

treeBSMax :: (Ord a) => BSTree a -> Maybe a
treeBSMax   btree = case btree of
        Null -> Nothing
        Node _ val Null -> Just val
        Node _ val right -> treeBSMax right

treeBSMin :: (Ord a) => BSTree a -> Maybe a
treeBSMin btree = case btree of
       Null -> Nothing
       Node Null val _ -> Just val
       Node left val _ -> treeBSMin left

isBSTree :: (Ord a) => BinaryTree a -> Bool
isBSTree btree = case btree of
      Null -> True                       -- changed it!
      Node Null val Null -> True
      Node lt val rt -> isBSTree lt       -- these two lines
                        && isBSTree rt     -- were missing !!
                        && inOrder (treeBSMax lt) val (treeBSMin rt)
                 where
                 inOrder Nothing  _ Nothing   =  True
                 inOrder Nothing  v (Just y)  =  v <= y
                 inOrder (Just x) v Nothing   =  x <= v
                 inOrder (Just x) v (Just y)  =  x <= v && v <= y

这当然效率不高。 (为什么留作练习)

【讨论】:

  • 需要Node Null val Null -&gt; True吗?
  • 先正确,后效率!而且它实际上可能会提高效率,即使它是多余的。此外,无论如何,算法本身效率极低。
猜你喜欢
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2020-08-03
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多