Professional Documents
Culture Documents
Haskell 07
Haskell 07
Haskell 07
-- Çàäà÷à 1 ------------------------------------
isSearch :: (Ord a) => BinTreeM a -> Bool
isSearch EmptyM = True
isSearch (NodeM v k bl br)
| k <= 0 = False
| otherwise = compareV v bl br && isSearch bl && isSearch br
where compareV :: (Ord a) => a -> BinTreeM a -> BinTreeM a -> Bool
compareV _ (EmptyM) (EmptyM) = True
compareV vv (EmptyM) (NodeM vr _ _ _) = vv < vr
compareV vv (NodeM vl _ _ _) (EmptyM) = vv > vl
compareV vv (NodeM vl _ _ _) (NodeM vr _ _ _) = vv > vl && vv < vr
-- Çàäà÷à 2 ------------------------------------
elemSearch :: (Ord a) => BinTreeM a -> a -> Bool
elemSearch EmptyM _ = False
elemSearch (NodeM v _ bl br) val
| v == val = True
| val < v = elemSearch bl val
| otherwise = elemSearch br val
-- Çàäà÷à 3 ------------------------------------
insSearch :: (Ord a) => BinTreeM a -> a -> BinTreeM a
insSearch EmptyM val = NodeM val 1 EmptyM EmptyM
insSearch (NodeM v k bl br) val
| val == v = NodeM v (k+1) bl br
| val < v = NodeM v k (insSearch bl val) br
| otherwise = NodeM v k bl (insSearch br val)
-- Çàäà÷à 4 ------------------------------------
delSearch :: (Ord a) => BinTreeM a -> a -> BinTreeM a
delSearch EmptyM _ = EmptyM
delSearch (NodeM v k EmptyM EmptyM) val --leaf
| val == v && k > 1 = NodeM v (k-1) EmptyM EmptyM
| otherwise = EmptyM
delSearch (NodeM v k EmptyM br) val --one child right
| val == v && k > 1 = NodeM v (k-1) EmptyM br
| val == v && k == 1 = br
| val > v = NodeM v k EmptyM (delSearch br val)
| otherwise = NodeM v k EmptyM br
delSearch (NodeM v k bl EmptyM) val --one child left
| val == v && k > 1 = NodeM v (k-1) bl EmptyM
| val == v && k == 1 = bl
| val > v = NodeM v k bl EmptyM
| otherwise = NodeM v k (delSearch bl val) EmptyM
delSearch curr@(NodeM v k bl br) val --two childs
| val == v && k > 1 = NodeM v (k-1) bl br
| val > v = NodeM v k bl (delSearch br val)
| val < v = NodeM v k (delSearch bl val) br
| otherwise =
let inSucc = inorderSuccessor br --leftmost value bigger than current value
where inorderSuccessor :: BinTreeM a -> BinTreeM a
inorderSuccessor EmptyM = error "Right undertree can't be
empty"
inorderSuccessor (NodeM sv sk EmptyM EmptyM) = NodeM sv sk
EmptyM EmptyM
inorderSuccessor (NodeM sv sk EmptyM sbr) = NodeM sv sk
EmptyM sbr
inorderSuccessor (NodeM _ _ sbl _) = inorderSuccessor
sbl
succDel :: (Ord a) => BinTreeM a -> BinTreeM a -> BinTreeM a -- succ|
curr
succDel EmptyM _ = error "Inorder Successor can't be empty"
succDel _ EmptyM = error "Input tree can't be empty"
succDel (NodeM _ _ (NodeM _ _ _ _) _) _ = error "InordSuccessor can't
have left child"
succDel (NodeM svv skk EmptyM _) (NodeM _ _ cbl cbr) =
NodeM svv skk cbl $ until cond step cbr
where --cond :: BinTreeM a -> Bool
cond tree = not (elemSearch tree svv)
--step :: BinTreeM a -> BinTreeM a
step ctree = delSearch ctree svv
in succDel inSucc curr
-- Çàäà÷à 5 ------------------------------------
sortList :: (Ord a) => [a] -> [a]
sortList [] = []
sortList xs =
let tree = foldl insSearch EmptyM xs
symGoThrough :: (Ord a) => BinTreeM a -> [a]
symGoThrough EmptyM = []
symGoThrough (NodeM x k l r) = symGoThrough l ++ (multiCopy x k) ++
symGoThrough r
in symGoThrough tree
-- Çàäà÷à 6 ------------------------------------
findBInform :: (Bounded a, Ord a) => Btree a -> BInform a
findBInform (NodeB [] _) = error "Key list can't be empty"
findBInform (NodeB ks []) = BInform 0 (head ks) (last ks)
findBInform t = BInform (height t) (lm t) (rm t)
where height :: Btree a -> Int
height (NodeB _ []) = 0
height (NodeB _ ts) = 1 + (height $ head ts)
lm :: Btree a -> a
lm (NodeB (k:_) []) = k
lm (NodeB _ ts) = lm $ head ts
rm :: Btree a -> a
rm (NodeB ks []) = last ks
rm (NodeB _ ts) = rm $ last ts
-- Çàäà÷à 7 ------------------------------------
-- B-äåðåâî ïîðÿäêà t (NodeB kl tl) =>
-- t-1 <= length kl <= 2*t-1 && t <= length tl <= 2*t
-- data Btree a = NodeB [a] [Btree a] deriving (Show, Eq)
-- ãîëîâí³ õàðàêòåðèñòèêè B-äåðåâî (BInform heigth min max)
-- data BInform a = BInform {hB::Int, minB::a, maxB::a} deriving (Show, Eq)
-- Çàäà÷à 8 ------------------------------------
eqBtree :: (Bounded a, Ord a) => Int -> Btree a -> Btree a -> Bool
eqBtree _ f s = sort (treeToString f) == sort (treeToString s)
-- Çàäà÷à 9 ------------------------------------
elemBtree :: Ord a => Btree a -> a -> Bool
elemBtree t x = elem x $ treeToString t