amiga-e/amigae33a/E_v3.3a/Src/Src/Guide/tree.e

83 lines
1.7 KiB
Plaintext

OPT MODULE -> Make a module of these classes
OPT EXPORT -> Export everything
/* ------------------------------- */
/* The (abstract) base class, tree */
/* ------------------------------- */
OBJECT tree PRIVATE -> All data is private
left:PTR TO tree, right:PTR TO tree
ENDOBJECT
/* Count nodes */
PROC nodes() OF tree
DEF tot=1
IF self.left THEN tot:=tot+self.left.nodes()
IF self.right THEN tot:=tot+self.right.nodes()
ENDPROC tot
/* Count leaves, and optionally show them */
PROC leaves(show=FALSE) OF tree
DEF tot=0
IF self.left
tot:=tot+self.left.leaves(show)
ENDIF
IF self.right
tot:=tot+self.right.leaves(show)
ELSEIF self.left=NIL -> Both NIL, so a leaf
IF show THEN self.print_node()
tot++
ENDIF
ENDPROC tot
/* Abstract method, add */
PROC add(x) OF tree IS EMPTY
/* Abstract method, print_node */
PROC print_node() OF tree IS EMPTY
/* Print the tree in order, left to right */
PROC print() OF tree
IF self.left THEN self.left.print()
self.print_node()
IF self.right THEN self.right.print()
ENDPROC
/* ---------------------- */
/* The integer_tree class */
/* ---------------------- */
/* Inherit tree */
OBJECT integer_tree OF tree PRIVATE -> All data is private
int
ENDOBJECT
/* Constructor, start with one integer */
PROC create(i) OF integer_tree
self.int:=i
ENDPROC
/* Add an integer */
PROC add(i) OF integer_tree
DEF p:PTR TO integer_tree
IF i < self.int
IF self.left
self.left.add(i)
ELSE
self.left:=NEW p.create(i)
ENDIF
ELSEIF i > self.int
IF self.right
self.right.add(i)
ELSE
self.right:=NEW p.create(i)
ENDIF
ENDIF
ENDPROC
/* Print a node */
PROC print_node() OF integer_tree
WriteF('\d ', self.int)
ENDPROC