70 lines
1.4 KiB
Plaintext
70 lines
1.4 KiB
Plaintext
class Tree
|
|
{
|
|
readonly Int label
|
|
readonly Tree? left
|
|
readonly Tree? right
|
|
|
|
new make (Int label, Tree? left := null, Tree? right := null)
|
|
{
|
|
this.label = label
|
|
this.left = left
|
|
this.right = right
|
|
}
|
|
|
|
Void preorder(|Int->Void| func)
|
|
{
|
|
func(label)
|
|
left?.preorder(func) // ?. will not call method if 'left' is null
|
|
right?.preorder(func)
|
|
}
|
|
|
|
Void postorder(|Int->Void| func)
|
|
{
|
|
left?.postorder(func)
|
|
right?.postorder(func)
|
|
func(label)
|
|
}
|
|
|
|
Void inorder(|Int->Void| func)
|
|
{
|
|
left?.inorder(func)
|
|
func(label)
|
|
right?.inorder(func)
|
|
}
|
|
|
|
Void levelorder(|Int->Void| func)
|
|
{
|
|
Tree[] nodes := [this]
|
|
while (nodes.size > 0)
|
|
{
|
|
Tree cur := nodes.removeAt(0)
|
|
func(cur.label)
|
|
if (cur.left != null) nodes.add (cur.left)
|
|
if (cur.right != null) nodes.add (cur.right)
|
|
}
|
|
}
|
|
}
|
|
|
|
class Main
|
|
{
|
|
public static Void main ()
|
|
{
|
|
tree := Tree(1,
|
|
Tree(2, Tree(4, Tree(7)), Tree(5)),
|
|
Tree(3, Tree(6, Tree(8), Tree(9))))
|
|
List result := [,]
|
|
collect := |Int a -> Void| { result.add(a) }
|
|
tree.preorder(collect)
|
|
echo ("preorder: " + result.join(" "))
|
|
result = [,]
|
|
tree.inorder(collect)
|
|
echo ("inorder: " + result.join(" "))
|
|
result = [,]
|
|
tree.postorder(collect)
|
|
echo ("postorder: " + result.join(" "))
|
|
result = [,]
|
|
tree.levelorder(collect)
|
|
echo ("levelorder: " + result.join(" "))
|
|
}
|
|
}
|