RosettaCodeData/Task/Tree-traversal/M2000-Interpreter/tree-traversal-3.m2000
2023-07-01 13:44:08 -04:00

86 lines
2.8 KiB
Text

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