module FPPrac.Trees.RedBlackTree
( showRBTree
, showRBTreeList
, RBTreeG(..)
, ColorG(..)
, exampleTree
)where
import FPPrac.Trees.GeneralTree
import FPPrac.Trees.LayoutTree
import EventLoop.Output
data ColorG = RedG
| BlackG
| GreyG
data RBTreeG = RBNodeG ColorG String [RBTreeG]
instance GeneralizeTree RBTreeG where
generalizeTree (RBNodeG col _ []) = GeneralTreeBox content []
where
content = [GeneralNode (colorGToColor col) 5]
generalizeTree (RBNodeG col str children) = GeneralTreeBox content children'WithLines
where
content = [GeneralNode (colorGToColor col) 20, GeneralNodeText (0,0,0) str]
children' = map generalizeTree children
line = GeneralLine (0,0,0)
children'WithLines = zip (repeat line) children'
colorGToColor :: ColorG -> Color
colorGToColor RedG = (255, 0, 0)
colorGToColor BlackG = (0, 0, 0)
colorGToColor GreyG = (125, 125, 125)
showRBTree :: RBTreeG -> IO ()
showRBTree rbTree = showRBTreeList [rbTree]
showRBTreeList :: [RBTreeG] -> IO ()
showRBTreeList rbTrees = outSingle (OutGraphical (Draw (showRBTreeList' 0 0 rbTrees) "trees"))
showRBTreeList' :: TopOffset -> Int -> [RBTreeG] -> GObject
showRBTreeList' _ _ [] = Container []
showRBTreeList' top i (rbTree:ts) = Container (text:pGeneral:gts)
where
(Container gts) = showRBTreeList' top' i' ts
top' = 10 + bottomGeneral
(lGeneral, rightGeneral, bottomGeneral) = layoutGeneralTree 0 top (generalizeTree rbTree)
pGeneral = printTree lGeneral
i' = i + 1
text = treeIndex i (0, top)
layoutRBTree :: LeftOffset -> TopOffset -> RBTreeG -> (LayoutTree, RightOffset, BottomOffset)
layoutRBTree left top rbTree = layoutGeneralTree left top $ generalizeTree rbTree
exampleTree = RBNodeG BlackG "12"
[ RBNodeG RedG "11"
[ RBNodeG BlackG "16"
[ RBNodeG BlackG "" [],
RBNodeG BlackG "" []
],
RBNodeG BlackG "24"
[RBNodeG BlackG "" [],
RBNodeG BlackG "" []
]
],
RBNodeG RedG "13"
[RBNodeG BlackG "36" [],
RBNodeG BlackG "28"
[RBNodeG RedG "36"
[RBNodeG BlackG "" [],
RBNodeG BlackG "" []
],
RBNodeG BlackG "" []
]
]
]