{########################################################################## # UNBALANCED BINARY SEARCH TREE MODULE # # This module will take elements and insert them into a binary tree # maintaining 'order' via the COMPARE function in UBSMOD.TYP. The tree # remains unbalanced, however, so searching is dependent on input (the # more random the input, the quicker the routine. # # NOTES: # 1) Be sure to copy UBSMOD.TYP that contains the type definitions # of this module. Changing the 'element' type will require mod- # ification of the COMPARE and PRINT func/proc in the above file. # 2) Your driver program should include the $I UBSMOD.EXT that defines # all of the external funct/procs, and $I UBSTYP. # 3) Final linkage includes your DRIVER and UBSMOD. # 4) There is a small UBSTST.PAS file that is a short test program # that you may use to test your change of the 'element' et.al. # # by DAVE HEYLIGER - AMUS STAFF # # last update: 09-12-85 ############################################################################} MODULE UBSMOD; {+-- This module implements the following set operations using an unbalanced | binary search tree: | | ubsmakenull - initializes set to empty set | | ubsinsert - inserts element into set | | ubssearch - searches and if found retrieves element | | ubsdump - dumps the tree using an inorder traversal +-----------------------------------------------------------------------} {$I ubsmod.typ} procedure ubsmakenull(var t: ubs); {+-- on entry - true | on exit - t represents an empty set +----------------------------------------} begin { ubsmakenull } t := nil; end; { ubsmakenull } procedure ubsinsert(x: ubselement; var t: ubs); {+-- on entry - t has been initialized previously, | if any node n compare(x,n)=0 then x replaces n. | compare determines '=','<','>' for ubselements. | on exit - x is inserted into t +-----------------------------------------------------------------} begin { ubsinsert } if t = nil then begin { base case } new(t); t^.element := x; t^.left := nil; { no left subtree } t^.right := nil { no right subtree } end { base case } else if compare(x,t^.element) = -1 then ubsinsert(x,t^.left) else if compare(x,t^.element) = 0 then t^.element := x else ubsinsert(x,t^.right); end; { ubsinsert } function ubssearch(x: ubselement; var r: ubselement; t: ubs):boolean; {+-- on entry - t has been initialized previously; | on exit - returns true iff there is an element r in the tree such that | compare(x,r) = 0; in that case r is returned in r. | returns false otherwise. +---------------------------------------------------------------------------} begin { ubssearch } if t = nil then ubssearch := false { not found } else if compare(x,t^.element) = -1 then ubssearch := ubssearch(x,r,t^.left) else if compare(x,t^.element) = 0 then begin { found } r := t^.element; { returns element } ubssearch := true; { x found } end { found } else ubssearch := ubssearch(x,r,t^.right); end; { ubssearch } procedure ubsdump(t: ubs; var out: text); {+-- on entry - t has been initialized previously | on exit - tree contents is dumped on file out in a reasonable form; | inorder traversal is used +------------------------------------------------------------------------} begin { ubsdump } if t <> nil then begin { non empty tree } ubsdump(t^.left,out); print(out,t^.element); ubsdump(t^.right,out); end; { non empty tree } end; { ubsdump } . .