haskell binary tree

-- 求二叉树的最大深度、直径、统计二叉树的节点数量
-- 测试样例
-- (Node 1 (Node 2 (Node 4 Empty Empty) Empty) (Node 3 Empty (Node 5 (Node 6 Empty Empty) Empty)))
-- 节点个数:6个 最大深度:4 最大宽度:6
-- 二叉树结构的定义
data Tree a = Node a (Tree a) (Tree a) | Empty deriving Show


-- 求二叉树的节点个数
size :: Tree a -> Int
size Empty = 0
size (Node n l r) = 1 + (size l) + (size r)

-- 求二叉树的最大深度
height :: Tree a -> Int
height Empty = 0
height (Node n l r) = 1 + max (height l) (height r)

-- 求二叉树的直径 (【左子树最大深度+右子树最大深度】-1)
diameter :: Tree a -> Int
diameter Empty = 0
diameter (Node n l r) = 1 + height l + height r

-- 对二叉树的中旬遍历(左->中->右)
-- (Node 'A' (Node 'B' (Node 'D' Empty Empty) (Node 'E' Empty Empty)) (Node 'C' (Node 'F' Empty Empty) Empty))
elements :: Tree a -> [a]
elements Empty = []
elements (Node a l r) = elements l ++ [a] ++ elements r


-- 二叉搜索树
search :: Ord a => a -> Tree a -> Bool
search x Empty = False
search x (Node n l r)
    | x == n = True
    | x < n = search x l
    | x > n = search x r
    

-- 向binary search tree插入节点

insert :: Ord a => a -> Tree a -> Tree a
insert n Empty = Node n Empty Empty
insert n (Node a l r)
    | n < a = Node a (insert n l) r 
    | otherwise = Node a l (insert n r)

-- 创建一个binary search tree (输入一个list,输出一个tree)
-- insert :: Ord a => a -> Tree a -> Tree a
-- insert n Empty = Node n Empty Empty
-- insert n (Node a l r)
    -- | n == a = Node a l r
    -- | n < a = Node a (insert n l) r 
    -- | otherwise = Node a l (insert n r)

buildtree :: Ord a => [a] -> Tree a 
buildtree [] = Empty
buildtree (x:xs) = insert x (buildtree xs)


-- tree sort
treesort :: Ord a => [a] -> [a]
treesort lst = elements $ list_to_bst lst

list_to_bst :: Ord a => [a] -> Tree a
list_to_bst [] = Empty
list_to_bst (x:xs) = insert x $ list_to_bst xs
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值