From 7b9a62462c3c0cba46a654c5763bb475231889b7 Mon Sep 17 00:00:00 2001 From: James Eversole Date: Fri, 3 Jan 2025 11:42:45 -0600 Subject: [PATCH] Level Order Traversal demo --- demos/LevelOrderTraversal.tri | 34 ++++++++++++++++++++++++++++++++++ lib/base.tri | 6 ++++++ 2 files changed, 40 insertions(+) create mode 100644 demos/LevelOrderTraversal.tri diff --git a/demos/LevelOrderTraversal.tri b/demos/LevelOrderTraversal.tri new file mode 100644 index 0000000..d5a3bce --- /dev/null +++ b/demos/LevelOrderTraversal.tri @@ -0,0 +1,34 @@ +-- Level Order Traversal of a labelled binary tree +-- Objective: Print each "level" of the tree on a separate line +-- +-- NOTICE: This demo relies on tricu base library functions +-- +-- We model labelled binary trees as sublists where values act as labels. We +-- require explicit notation of empty nodes. Empty nodes can be represented +-- with an empty list, `[]`, which is equivalent 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 +-- + +isLeaf = (\node : lOr (emptyList node) (emptyList (tail node))) +getLabel = (\node : head node) +getLeft = (\node : if (emptyList node) [] (if (emptyList (tail node)) [] (head (tail node)))) +getRight = (\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 getLabel queue) (self (filter (\node : not (emptyList node)) (lconcat (map getLeft queue) (map getRight 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) "" +flatLOT = (\s : lconcat (t 10 t) (flatten (levelOrderToString s))) + +exampleOne = flatLOT [("1") [("2") [("4") t t] t] [("3") [("5") t t] [("6") t t]]]] +exampleTwo = flatLOT [("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]]] diff --git a/lib/base.tri b/lib/base.tri index 7b69554..d6f0568 100644 --- a/lib/base.tri +++ b/lib/base.tri @@ -33,3 +33,9 @@ lOr = triage (\x : x) (\_ _ : true) (\_ _ x : true) hmap = y (\self : matchList (\f : t) (\hd tl f : pair (f hd) (self tl f))) map = (\f l : hmap l f) equal = y (\self : triage (triage true (\z : false) (\y z : false)) (\ax : triage false (self ax) (\y z : false)) (\ax ay : triage false (\z : false) (\bx by : lAnd (self ax bx) (self ay by)))) +hfilter = y (\self : matchList (\f : t) (\hd tl f : matchBool (t hd) i (f hd) (self tl f))) +filter = (\f l : hfilter l f) +hfoldl = y (\self f l x : matchList (\acc : acc) (\hd tl acc : self f tl (f acc hd)) l x) +foldl = (\f x l : hfoldl f l x) +hfoldr = y (\self x f l : matchList x (\hd tl : f (self x f tl) hd) l) +foldr = (\f x l : hfoldr x f l)