(*  Tietorakenteet ja algoritmit 1999				*)
(*    Esimerkki 3-9 : Haku järjestetystä binääripuusta	*)
(*    9.9.1999 MM								*)
(*  - Ratkaisussa jätetään vielä tuhoamatta puu.		*)
(*  - main():issa luodaan seuraavanlainen puu:			*)
(*     4      								*)
(*    /   \    								*)
(*   2     8  								*)
(*  / \   / \     							*)
(* 1   3 6   9    							*)
program Esimerkki3_9;

import TRA;

function binpuuhaku(T:BTREE; x:ELEMENT):boolean; 
var n:BTREE_NODE;
	loytyi:boolean;	
begin
	loytyi := false;
	n := BTREE_ROOT(T);
	while ((not loytyi) and (n<>NIL)) do
		if (BTREE_SAME(T, BTREE_RETRIEVE(T, n), x)) then
			loytyi := true
		else 
			if (BTREE_LESS(T, x, BTREE_RETRIEVE(T, n))) then
				n := BTREE_LEFTCHILD(T, n)
			else
				n := BTREE_RIGHTCHILD(T, n);
	binpuuhaku:=loytyi;
end;

var T:BTREE;
    apu,n:BTREE_NODE;
begin	
	INT_BTREE_CREATE(T);
	apu:=INT_BTREE_CREATE_NODE(4);
	BTREE_ASSIGN_ROOT(T,apu); (* Juuri *)
	n := BTREE_ROOT(T);
	BTREE_ASSIGN_CHILD(T, n, left,  INT_BTREE_CREATE_NODE(2));
	BTREE_ASSIGN_CHILD(T, n, right, INT_BTREE_CREATE_NODE(8));

	n := BTREE_LEFTCHILD(T, BTREE_ROOT(T));
	BTREE_ASSIGN_CHILD(T, n, left, INT_BTREE_CREATE_NODE(1));
	BTREE_ASSIGN_CHILD(T, n, right, INT_BTREE_CREATE_NODE(3));

	n := BTREE_RIGHTCHILD(T, BTREE_ROOT(T));
	BTREE_ASSIGN_CHILD(T, n, left, INT_BTREE_CREATE_NODE(6));
	BTREE_ASSIGN_CHILD(T, n, right, INT_BTREE_CREATE_NODE(9));

	n := INT_BTREE_CREATE_NODE(9);
	(* n osoittaa nyt "irtonaiseen" solmuun jonka nimiö on 9 *)

	if (binpuuhaku(T, TREE_RETRIEVE(T, n))) then writeln('Löytyy')
	else writeln('Ei löydy');
end.

