tricu now allows defining terms in any order and will resolve dependencies to ensure that they're evaluated in the right order. Undefined terms are detected and throw errors during dependency ordering. For now we can't define top-level mutually recursive terms.
63 lines
1.9 KiB
Plaintext
63 lines
1.9 KiB
Plaintext
-- Level Order Traversal of a labelled binary tree
|
|
-- Objective: Print each "level" of the tree on a separate line
|
|
--
|
|
-- We model labelled binary trees as nested lists where values act as labels. We
|
|
-- require explicit notation of empty nodes. Empty nodes can be represented
|
|
-- with an empty list, `[]`, which evaluates to a single node `t`.
|
|
--
|
|
-- Example tree inputs:
|
|
-- [("1") [("2") [("4") t t] t] [("3") [("5") t t] [("6") t t]]]]
|
|
-- Graph:
|
|
-- 1
|
|
-- / \
|
|
-- 2 3
|
|
-- / / \
|
|
-- 4 5 6
|
|
|
|
label = \node : head node
|
|
|
|
left = (\node : if (emptyList? node)
|
|
[]
|
|
(if (emptyList? (tail node))
|
|
[]
|
|
(head (tail node))))
|
|
|
|
right = (\node : if (emptyList? node)
|
|
[]
|
|
(if (emptyList? (tail node))
|
|
[]
|
|
(if (emptyList? (tail (tail node)))
|
|
[]
|
|
(head (tail (tail node))))))
|
|
|
|
processLevel = y (\self queue : if (emptyList? queue)
|
|
[]
|
|
(pair (map label queue) (self (filter
|
|
(\node : not? (emptyList? node))
|
|
(lconcat (map left queue) (map right queue))))))
|
|
|
|
levelOrderTraversal_ = \a : processLevel (t a t)
|
|
|
|
toLineString = y (\self levels : if (emptyList? levels)
|
|
""
|
|
(lconcat
|
|
(lconcat (map (\x : lconcat x " ") (head levels)) "")
|
|
(if (emptyList? (tail levels)) "" (lconcat (t (t 10 t) t) (self (tail levels))))))
|
|
|
|
levelOrderToString = \s : toLineString (levelOrderTraversal_ s)
|
|
|
|
flatten = foldl (\acc x : lconcat acc x) ""
|
|
|
|
levelOrderTraversal = \s : lconcat (t 10 t) (flatten (levelOrderToString s))
|
|
|
|
exampleOne = levelOrderTraversal [("1")
|
|
[("2") [("4") t t] t]
|
|
[("3") [("5") t t] [("6") t t]]]
|
|
|
|
exampleTwo = levelOrderTraversal [("1")
|
|
[("2") [("4") [("8") t t] [("9") t t]]
|
|
[("6") [("10") t t] [("12") t t]]]
|
|
[("3") [("5") [("11") t t] t] [("7") t t]]]
|
|
|
|
exampleTwo
|