summaryrefslogtreecommitdiff
path: root/61-69/65.hs
diff options
context:
space:
mode:
Diffstat (limited to '61-69/65.hs')
-rw-r--r--61-69/65.hs16
1 files changed, 16 insertions, 0 deletions
diff --git a/61-69/65.hs b/61-69/65.hs
new file mode 100644
index 0000000..179b972
--- /dev/null
+++ b/61-69/65.hs
@@ -0,0 +1,16 @@
+data Tree a = Empty | Branch a (Tree a) (Tree a) deriving (Show, Eq)
+
+layout :: Tree Char -> Tree (Char, (Int, Int))
+
+layout t = draw t (1 + 2 ^ (dep - 1) - 2 ^ (dep - ldep)) 1 (2 ^ (dep - 2))
+ where depth Empty = 0
+ depth (Branch _ l r) = 1 + max (depth l) (depth r)
+ ldepth Empty = 0
+ ldepth (Branch _ l _) = 1 + ldepth l
+ dep = depth t
+ ldep = ldepth t
+ draw Empty _ _ _ = Empty
+ draw (Branch v l r) x y h = Branch (v, (x, y)) lt rt
+ where h' = h `div` 2
+ lt = draw l (x - h) (y + 1) h'
+ rt = draw r (x + h) (y + 1) h'