(* Define auxiliary procedures *) let proc traverse(t) = if isEmptyTree(t) then unit else if isLeaf(t) then write leafVal(t) else let left := leftSubtree(t) in let right := rightSubtree(t) in traverse(left); write nodeVal(t); traverse(right) in let exampleTree := node(4, node(2, leaf(1), leaf(3)), node(6, leaf(5), leaf(7))) in let exampleLeaf := leaf(9) in let exampleNull := null in (try (if isEmptyTree(exampleTree) then write 0 else write 1)); (* 2 pt *) (try (if isEmptyTree(exampleNull) then write 0 else write 1)); (* 2 pt *) (try (if isLeaf(exampleTree) then write 0 else write 1)); (* 2 pt *) (try (if isLeaf(exampleLeaf) then write 0 else write 1)); (* 2 pt *) (try (write nodeVal(exampleTree))); (* 2 pt *) (try (write leafVal(exampleLeaf))); (* 2 pt *) (try (write nodeVal(leftSubtree(exampleTree)))); (* 2 pt *) (try (write nodeVal(rightSubtree(exampleTree)))); (* 2 pt *) (try (write leafVal(leftSubtree(rightSubtree(exampleTree))))); (* 2 pt *) (try (traverse(exampleTree))); (* 2 pt *) (try (traverse(mirrorize(exampleTree)))) (* 10 pt *)