program puuesimerkkeja;

import TRA;

procedure tulosta_tasoittain(T : TREE);
	var n : TREE_NODE;
		Q : QUEUE;
begin

	(* PQ_ = VOIDPTR_QUEUE_ *)

	PQ_CREATE(Q);
	if (TREE_ROOT(T) <> TREE_NIL) then
		PQ_ENQUEUE(Q, TREE_ROOT(T));

	while (not QUEUE_EMPTY(Q)) do begin
		n := PQ_FRONT(Q);
		PQ_DEQUEUE(Q);
		TREE_PRINT_NODE(T, n); write(' ');
		n := TREE_LEFTMOST_CHILD(T, n);
		while (n <> TREE_NIL) do begin
			PQ_ENQUEUE(Q, n);
			n := TREE_RIGHT_SIBLING(T, n);
		end; (* while *)
	end; (* while *)
	
	QUEUE_FREE(Q);
end; (* tulosta_tasoittain *)

var puu : TREE;
	n, m, l : TREE_NODE;
	x : ELEMENT;
	i : integer;

begin

	(*
             1
           //\\
          /|  |\
         / |  | \
        2  3  4  5
       /\  |  |
      6  7 8  9
              |
              10
	*)

	(* IT_ = INT_TREE_ *)

	IT_CREATE(puu);

	n := IT_CREATE_NODE(1);
	IT_ASSIGN_ROOT(puu, n);
	m := IT_CREATE_NODE(2);
	IT_ASSIGN_LEFTMOST_CHILD(puu, n, m);
	for i := 3 to 5 do begin
		l := IT_CREATE_NODE(i);
		IT_ASSIGN_RIGHT_SIBLING(puu, m, l);
		m := l;
	end;

	m := TREE_LEFTMOST_CHILD(puu, TREE_ROOT(puu));
	IT_ASSIGN_LEFTMOST_CHILD(puu, m, IT_CREATE_NODE(6));
	IT_ASSIGN_RIGHT_SIBLING(puu, TREE_LEFTMOST_CHILD(puu, m), IT_CREATE_NODE(7));

	m := TREE_RIGHT_SIBLING(puu, m);
  	IT_ASSIGN_LEFTMOST_CHILD(puu, m, IT_CREATE_NODE(8));

	m := TREE_RIGHT_SIBLING(puu, m);
	IT_ASSIGN_LEFTMOST_CHILD(puu, m, IT_CREATE_NODE(9));

	m := TREE_LEFTMOST_CHILD(puu, m);

	IT_ASSIGN_LEFTMOST_CHILD(puu, m, IT_CREATE_NODE(10));

	writeln('Tasoittain');
	tulosta_tasoittain(puu);
	writeln;

	TREE_FREE(puu);
end.

