(* tree.korkeus.p SJ *)

program puutehtavia;

import TRA;

function puu_korkeus_rek(T : TREE; n : TREE_NODE) : integer;
	var lkork, max : integer;
		lapsi : TREE_NODE;
begin
	if (n <> TREE_NIL) then begin
		max := -1;
		lapsi := TREE_LEFTMOST_CHILD(T, n);
		while (lapsi <> TREE_NIL) do begin
			lkork := puu_korkeus_rek(T, lapsi);
			if (lkork > max) then
				max := lkork;
			lapsi := TREE_RIGHT_SIBLING(T, lapsi);
		end;
		puu_korkeus_rek := max+1;
	end else
		puu_korkeus_rek := -1;
end;

function puu_korkeus(T : TREE) : integer;
begin
	puu_korkeus := puu_korkeus_rek(T, BTREE_ROOT(T));
end;


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

begin

	(*
	    1
      //\\
     /|  |\
    / |  | \
   2  6 10  14_____________
  /\  |  |  |  \  \  \  \  \
  3 5 8 11  15 16 17 18 19 20
         |
        12
	*)

	INT_TREE_CREATE(puu);

	n := INT_TREE_CREATE_NODE(1);
	INT_TREE_ASSIGN_ROOT(puu, n);
	m := INT_TREE_CREATE_NODE(2);
	INT_TREE_ASSIGN_LEFTMOST_CHILD(puu, n, m);
	for i := 1 to 3 do begin
		l := INT_TREE_CREATE_NODE(2+4*i);
		INT_TREE_ASSIGN_RIGHT_SIBLING(puu, m, l);
		m := l;
	end;

	m := TREE_LEFTMOST_CHILD(puu, TREE_ROOT(puu));
	INT_TREE_ASSIGN_LEFTMOST_CHILD(puu, m, INT_TREE_CREATE_NODE(3));
	INT_TREE_ASSIGN_RIGHT_SIBLING(puu, TREE_LEFTMOST_CHILD(puu, m), INT_TREE_CREATE_NODE(5));

	m := TREE_RIGHT_SIBLING(puu, m);
  	INT_TREE_ASSIGN_LEFTMOST_CHILD(puu, m, INT_TREE_CREATE_NODE(8));

	m := TREE_RIGHT_SIBLING(puu, m);
	INT_TREE_ASSIGN_LEFTMOST_CHILD(puu, m, INT_TREE_CREATE_NODE(11));

	m := TREE_LEFTMOST_CHILD(puu, m);

	INT_TREE_ASSIGN_LEFTMOST_CHILD(puu, m, INT_TREE_CREATE_NODE(12));

	(* *)
	m := INT_TREE_CREATE_NODE(15);
	INT_TREE_ASSIGN_LEFTMOST_CHILD(puu, l,  m);
	for i := 16 to 20 do begin
		l := INT_TREE_CREATE_NODE(i);
		INT_TREE_ASSIGN_RIGHT_SIBLING(puu, m, l);
		m := l;
	end;

	writeln('Korkeus : ', puu_korkeus(puu));

	TREE_FREE(puu);
end.

