欢迎访问宙启技术站
智能推送

在Haskell中实现一个简单的二叉搜索树

发布时间:2023-12-10 01:19:44

下面是一个简单的Haskell代码,用于实现一个二叉搜索树(Binary Search Tree):

data Tree a = EmptyTree | Node a (Tree a) (Tree a) deriving (Show, Read, Eq)

-- 在树中插入一个元素
insert :: (Ord a) => a -> Tree a -> Tree a
insert x EmptyTree = Node x EmptyTree EmptyTree
insert x (Node a left right)
    | x == a = Node x left right
    | x < a  = Node a (insert x left) right
    | x > a  = Node a left (insert x right)

-- 判断一个元素是否存在于树中
contains :: (Ord a) => a -> Tree a -> Bool
contains x EmptyTree = False
contains x (Node a left right)
    | x == a = True
    | x < a  = contains x left
    | x > a  = contains x right

-- 从树中删除一个元素
delete :: (Ord a) => a -> Tree a -> Tree a
delete x EmptyTree = EmptyTree
delete x (Node a left right)
    | x < a  = Node a (delete x left) right
    | x > a  = Node a left (delete x right)
    | otherwise = (Node a left (deleteMin right))
      where deleteMin (Node _ l r) = if l == EmptyTree then r else Node (minValue l) (deleteMin l) r
            minValue (Node a _ _) = a

-- 创建一个空树
emptyTree :: Tree a
emptyTree = EmptyTree

-- 将一个列表构建为二叉搜索树
fromList :: (Ord a) => [a] -> Tree a
fromList = foldr insert emptyTree

-- 将一个二叉搜索树转换为列表
toList :: Tree a -> [a]
toList EmptyTree = []
toList (Node a left right) = toList left ++ [a] ++ toList right

下面是一个使用二叉搜索树的例子:

main :: IO ()
main = do
    let tree = fromList [4, 2, 7, 1, 3, 6, 9]
    putStrLn $ "Tree: " ++ show tree
    putStrLn $ "Tree contains 3: " ++ show (contains 3 tree)
    putStrLn $ "Tree contains 5: " ++ show (contains 5 tree)
    let modifiedTree = delete 4 tree
    putStrLn $ "Modified tree: " ++ show modifiedTree
    putStrLn $ "Sorted elements: " ++ show (toList modifiedTree)

以上代码将输出:

Tree: Node 4 (Node 2 (Node 1 EmptyTree EmptyTree) (Node 3 EmptyTree EmptyTree)) (Node 7 (Node 6 EmptyTree EmptyTree) (Node 9 EmptyTree EmptyTree))
Tree contains 3: True
Tree contains 5: False
Modified tree: Node 3 (Node 2 (Node 1 EmptyTree EmptyTree) EmptyTree) (Node 7 (Node 6 EmptyTree EmptyTree) (Node 9 EmptyTree EmptyTree))
Sorted elements: [1,2,3,6,7,9]

这个例子演示了如何使用二叉搜索树进行插入、查找和删除元素,并且还展示了如何将树转换为排序后的元素列表。