【发布时间】:2021-05-21 09:36:26
【问题描述】:
我正在尝试从排序列表中创建一棵树,以便以后可以搜索它。
问题是
如果找到,我必须返回数字的索引,否则我返回-1,所以我创建了这个函数。
data Tree e i = Leaf e i | Node (Tree e i) e i (Tree e i)
occurs :: Int -> Tree Int Int -> Int
occurs x (Leaf y i) | x == y = i
| otherwise = -1
occurs x (Node l y i r) | x == y = i
| x < y = occurs x l
| otherwise = occurs x r
我的输入格式为(作为字符串)
3 # The length of as
1 5 7 # as
2 # The length of bs
5 6 # bs
我收到 2 个列表 as 和 bs
as 将成为树,bs 是我要检查它们是否存在于树中的数字(以及存在于何处)
预期的输出是:
1
-1
在索引 1 上找到 5 而没有找到 6 所以我返回 -1
所以我正在解析输入:
parse :: [Int] -> ([Int], [Int])
parse (n: xs) = (take n xs, tail $ drop n xs)
solve :: [Int] -> [Int]
solve xs = func as bs
where (as, bs) = parse xs
main ::IO ()
main = interact $ unlines . map show . solve . map read . words
然后我需要调用一个函数func,它将从as 列表中创建我的树,然后使用occurs 函数在树中搜索bs 中的每个元素
所以我的问题是
- 如何制作树以使其包含列表中的索引?
- 我的类型是针对这个问题以正确的方式创建的吗?
我的 Haskell 级别 = 达到了类型和类章节,在 GH 的 Cambridge Haskell 书中,并在 youtube 上关注 HaskellRank 系列。
【问题讨论】:
-
与问题没有直接关系,但返回
Int并用 -1 人为地表示不存在的索引不是“Haskell 方式”,尽管它在其他语言中很常见。它需要样板来确保索引是非负的,如果您希望找到元素,这很容易忘记。最好返回Maybe Int,如果找不到元素,则返回Nothing- 这更具描述性,也意味着您不能将结果视为Int而不处理它不存在的情况'不存在。 -
看起来您的树必须是 BST 才能使您的
occurs函数正常工作。您可能需要一些insert函数,给定一个 BST 和一个键元素对,将其插入 BST(通过返回一个新的 BST)。这可能会产生平衡的 BST(例如 AVL、红黑……),但重要的部分是它必须产生 BST。然后你可以利用这个insert函数来构建你的树,逐个处理元素。 (当然,其他方法也是可能的。)
标签: algorithm haskell data-structures binary-tree