-- 求二叉树的最大深度、直径、统计二叉树的节点数量
-- 测试样例
-- (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