summaryrefslogtreecommitdiff
path: root/tests/general/btrees.icn
diff options
context:
space:
mode:
Diffstat (limited to 'tests/general/btrees.icn')
-rw-r--r--tests/general/btrees.icn43
1 files changed, 43 insertions, 0 deletions
diff --git a/tests/general/btrees.icn b/tests/general/btrees.icn
new file mode 100644
index 0000000..bc786f5
--- /dev/null
+++ b/tests/general/btrees.icn
@@ -0,0 +1,43 @@
+#
+# B I N A R Y T R E E S
+#
+
+# This program accepts string representations of binary trees from
+# standard input. It performs a tree walk and lists the leaves of
+# each tree.
+
+record node(data,ltree,rtree)
+
+procedure main()
+ local line, tree
+ while line := read() do {
+ tree := tform(line)
+ write("tree walk")
+ every write(walk(tree))
+ write("leaves")
+ every write(leaves(tree))
+ }
+end
+
+procedure tform(s)
+ local value,left,right
+ if /s then return
+ s ? if value := tab(upto('(')) then {
+ move(1)
+ left := tab(bal(','))
+ move(1)
+ right := tab(bal(')'))
+ return node(value,tform(left),tform(right))
+ }
+ else return node(s)
+end
+
+procedure walk(t)
+ suspend walk(\t.ltree | \t.rtree)
+ return t.data
+end
+
+procedure leaves(t)
+ if not(\t.ltree | \t.rtree) then return t.data
+ suspend leaves(\t.ltree | \t.rtree)
+end