tree[] = [ 1 2 3 4 5 6 -1 7 -1 -1 -1 8 9 ]
# 
proc preorder ind . .
   if ind > len tree[] or tree[ind] = -1
      return
   .
   write " " & tree[ind]
   preorder ind * 2
   preorder ind * 2 + 1
.
write "preorder:"
preorder 1
print ""
# 
proc inorder ind . .
   if ind > len tree[] or tree[ind] = -1
      return
   .
   inorder ind * 2
   write " " & tree[ind]
   inorder ind * 2 + 1
.
write "inorder:"
inorder 1
print ""
# 
proc postorder ind . .
   if ind > len tree[] or tree[ind] = -1
      return
   .
   postorder ind * 2
   postorder ind * 2 + 1
   write " " & tree[ind]
.
write "postorder:"
postorder 1
print ""
# 
global tail head queue[] .
proc initqu n . .
   len queue[] n
   tail = 1
   head = 1
.
proc enqu v . .
   queue[tail] = v
   tail = (tail + 1) mod1 len queue[]
.
func dequ .
   if head = tail
      return -1
   .
   h = head
   head = (head + 1) mod1 len queue[]
   return queue[h]
.
initqu len tree[]
proc levelorder n . .
   enqu n
   repeat
      ind = dequ
      until ind = -1
      if ind < len tree[] and tree[ind] <> -1
         write " " & tree[ind]
         enqu ind * 2
         enqu ind * 2 + 1
      .
   .
.
write "level-order:"
levelorder 1
print ""
