haskell二进制搜索树

时间:2011-11-04 03:48:01

标签: haskell binary-search-tree

module Main where

import Data.List
import Data.Function

type Raw = (String, String)

icards =  [("the", "le"),("savage", "violent"),("work", "travail"),
           ("wild", "sauvage"),("chance", "occasion"),("than a", "qu'un")]

data Entry = Entry {wrd, def :: String, len :: Int, phr :: Bool}
             deriving Show

-- French-to-English, search-tree section

entries' :: [Entry]
entries' = map (\(x, y) -> Entry y x (length y) (' ' `elem` y)) icards

data Tree a = Empty | Tree a (Tree a) (Tree a)

tree :: Tree Entry
tree = build entries'

build :: [Entry] -> Tree Entry
build []     = Empty
build (e:es) = ins e (build es)

ins :: Entry -> Tree Entry -> Tree Entry

...

find :: Tree Entry -> Word -> String

...

translate' :: String -> String
translate' = unwords . (map (find tree)) . words

所以我正在尝试设计函数输入并找到但我不知道从哪里开始。有什么想法?

2 个答案:

答案 0 :(得分:2)

我不知道树应该按哪个标准排序,所以我只使用wrd。然后它看起来像:

ins :: Entry -> Tree Entry -> Tree Entry
ins entry Empty = Tree entry Empty Empty
ins entry@(Entry w _ _ _) (Tree current@(Entry w1 _ _ _) left right) 
   | w == w1 = error "duplicate entry"
   | w < w1 = Tree current (ins entry left) right
   | otherwise = Tree current left (ins entry right)  

如何到达那里?

与使用递归时一样,您需要一个基本案例。这里非常简单:如果树是空的,只需用包含数据的节点替换它。新节点没有子节点,因此我们使用Empty

如果你有一个完整的节点看起来比较困难,但这只是因为模式匹配,这个想法很简单:如果条目是“较小”,你需要用包含进入,如果它“更大”,你需要替换正确的孩子。

如果节点和条目都具有相同的“大小”,则有三个选项:保留旧节点,将其替换为新节点(保留子节点)或抛出错误(这似乎是最干净的解决方案,所以我做到了这里)。

答案 1 :(得分:2)

Landei答案的简单概括:

ins :: Ord a => a -> Tree a -> Tree a
ins x Empty = Tree x Empty Empty
ins x (Tree x' l r) = case compare x x' of
  EQ -> undefined
  LT -> Tree x' (ins x l) r
  GT -> Tree x' l (ins x r)

要使其适用于Tree Entry,您需要为Ord定义Entry的实例。