main(args(2)) := "preorder: " ++ toString(preOrder(testTree)) ++ "\ninoder: " ++ toString(inOrder(testTree)) ++ "\npostorder: " ++ toString(postOrder(testTree)) ++ "\nlevel-order: " ++ toString(levelOrder(testTree)); Node ::= (value : int, left : Node, right : Node); preOrder(n) := [n.value] ++ (preOrder(n.left) when isDefined(n, left) else []) ++ (preOrder(n.right) when isDefined(n, right) else []); inOrder(n) := (inOrder(n.left) when isDefined(n, left) else []) ++ [n.value] ++ (inOrder(n.right) when isDefined(n, right) else []); postOrder(n) := (postOrder(n.left) when isDefined(n, left) else []) ++ (postOrder(n.right) when isDefined(n, right) else []) ++ [n.value]; levelOrder(n) := levelOrderHelper([n]); levelOrderHelper(ns(1)) := let n := head(ns); in [] when size(ns) = 0 else [n.value] ++ levelOrderHelper(tail(ns) ++ ([n.left] when isDefined(n, left) else []) ++ ([n.right] when isDefined(n, right) else [])); testTree := (value : 1, left : (value : 2, left : (value : 4, left : (value : 7)), right : (value : 5)), right : (value : 3, left : (value : 6, left : (value : 8), right : (value : 9)) ) );