(!*******************************************************
Mosel Example Problems
======================
file bintree.mos
````````````````
a package that provides the functionality for
handling binary trees
(c) 2008 Fair Isaac Corporation
author: Y. Colombani, 2006
*******************************************************!)
package bintree
declarations
public btree_R:range
public btree_node=record
value:real
left,right:integer
end-record
public tree=record
lastnode:integer
nodes:dynamic array(btree_R) of btree_node
end-record
end-declarations
forward procedure show(t:tree,n:integer)
forward procedure makelist(t:tree,n:integer,l:list of real)
!**************************************************************
!* Public declarations
!**************************************************************
!**************
! Reset a tree
!**************
public procedure reset(t:tree)
delcell(t.nodes)
t.lastnode:=0
end-procedure
!************************
! Get the size of a tree
!************************
public function getsize(t:tree):integer
returned:=t.lastnode
end-function
!**************************
! Insert a value in a tree
!**************************
public procedure insert(t:tree,v:real)
if t.lastnode > 0 then
j:=1
repeat
p_j:=j
j:=if(t.nodes(j).value > v , t.nodes(j).left,t.nodes(j).right)
until (j=0)
if t.nodes(p_j).value <> v then
t.lastnode+=1
t.nodes(t.lastnode).value:=v
if t.nodes(p_j).value > v then
t.nodes(p_j).left:=t.lastnode
else
t.nodes(p_j).right:=t.lastnode
end-if
end-if
else
t.lastnode+=1
t.nodes(t.lastnode).value:=v
end-if
end-procedure
!***************************************************
! Check whether a value is already stored in a tree
!***************************************************
public function find(t:tree,v:real):boolean
if t.lastnode > 0 then
j:=1
repeat
if t.nodes(j).value > v then
j:=t.nodes(j).left
elif t.nodes(j).value < v then
j:=t.nodes(j).right
else
break
end-if
until (j=0)
returned:= j<>0
else
returned:=false
end-if
end-function
!*****************
!* Display a tree
!*****************
public procedure show(t:tree)
write("<")
if t.lastnode > 0 then
show(t,1)
end-if
writeln(" >")
end-procedure
!*************************************************
!* Return the sorted list of all values of a tree
!*************************************************
public function tolist(t:tree):list of real
if t.lastnode > 0 then
makelist(t,1,returned)
end-if
end-function
!**************************************************************
!* Private declarations
!**************************************************************
!********************
!* Display a subtree
!********************
procedure show(t:tree,n:integer)
if n > 0 then
show(t,t.nodes(n).left)
write(" ",t.nodes(n).value)
show(t,t.nodes(n).right)
end-if
end-procedure
!*****************************
!* Append a subtree to a list
!*****************************
procedure makelist(t:tree,n:integer,l:list of real)
if n > 0 then
makelist(t,t.nodes(n).left,l)
l+=[t.nodes(n).value]
makelist(t,t.nodes(n).right,l)
end-if
end-procedure
end-package
|
(!*******************************************************
Mosel Example Problems
======================
file exbtree.mos
````````````````
Example of use lists and of the 'bintree' package
-- Note: The package 'bintree' (file bintree.mos)
needs to be compiled before executing this model --
(c) 2008 Fair Isaac Corporation
author: Y. Colombani, 2006
*******************************************************!)
model exbtree
uses ':bintree.bim'
declarations
arbre:tree
allvals:list of real
end-declarations
repeat
insert(arbre,round(random*100))
until arbre.size = 10
write("Values in the binary tree:"); show(arbre)
allvals:=tolist(arbre)
writeln("The smallest value:",allvals.first)
writeln("The biggest value:",allvals.last)
writeln("The 5 first entries:",splithead(allvals,5))
writeln("Remaining after split:",allvals)
end-model
|