Module OOP { \\ Class is a global function (until this module end) Class Null { } \\ Null is a pointer to an object returned from class Null() Global Null->Null() Class Node { Public: x, Group LeftNode, Group RightNode Module preorder (visitor){ T->This printtree(T) sub printtree(T as pointer) If T is Null then Exit sub call visitor(T=>x) printtree(T=>LeftNode) printtree(T=>RightNode) end sub } Module inorder (visitor){ T->This printtree(T) sub printtree(T as pointer) If T is Null then Exit sub printtree(T=>LeftNode) call visitor(T=>x) printtree(T=>RightNode) end sub } Module postorder (visitor) { T->This printtree(T) sub printtree(T as pointer) If T is Null then Exit sub printtree(T=>LeftNode) printtree(T=>RightNode) call visitor(T=>x) end sub } Module level_order (visitor){ T->This Stack New { printtree(T) if empty then exit Read T Loop } sub printtree(T as pointer) If T is Null else call visitor(T=>x) Data T=>LeftNode, T=>RightNode end if end sub } Class: \\ after class: anything exist one time, \\ not included in final object Module Node { .LeftNode<=Null .RightNode<=Null Read .x \\ read ? for optional values Read ? .LeftNode, .RightNode } } \\ NodeTree return a pointer to a new Node Function NodeTree { \\ ![] pass currrent stack to Node() ->Node(![]) } Tree=NodeTree(1, NodeTree(2,NodeTree(4, NodeTree(7)), NodeTree(5)), NodeTree(3, NodeTree(6, NodeTree(8), NodeTree(9)))) printnum=lambda (title$) -> { Print Print title$; =lambda (x)-> { Print x;" "; } } Tree=>preorder printnum("preorder: ") Tree=>inorder printnum("inorder: ") Tree=>postorder printnum("postorder: ") Tree=>level_order printnum("level-order: ") } OOP