Don't require/allow naming a module, instead require that the importer names it. Allow importing into the local scope with the name !Local. Simplify namespacing logic. Updates all tests to reflect these changes.
64 lines
1.9 KiB
Plaintext
64 lines
1.9 KiB
Plaintext
!import "lib/base.tri" !Local
|
|
|
|
main = exampleTwo
|
|
-- 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]]]
|