MODULE TREENODE
   TYPE NODE
	TYPE (NODE), POINTER :: LEFT
	INTEGER              :: INFO
	TYPE (NODE), POINTER :: RIGHT
   END TYPE NODE
END MODULE

PROGRAM TREESAMPLE
	USE TREENODE
	IMPLICIT NONE
	TYPE (NODE), POINTER  :: ROOT
	INTEGER COUNT,NUMNODE
        ! we include the interface for TREEPRINT here
	INTERFACE
	  RECURSIVE SUBROUTINE TREEPRINT(T, COUNT)
		USE TREENODE
		TYPE (NODE), POINTER :: T
		INTEGER COUNT
	  END SUBROUTINE
	  RECURSIVE FUNCTION GENTREE(N, NUMNODE) RESULT (T)
		USE TREENODE
		TYPE (NODE), POINTER :: T
		INTEGER N, NUMNODE
	  END FUNCTION
	END INTERFACE
	! (* initialization *)
	NUMNODE = 0
	COUNT = 0
	ROOT => GENTREE(16,NUMNODE)
	CALL TREEPRINT(ROOT, COUNT)
END PROGRAM

!* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
!*       F U N C T I O N   G E N T R E E                   *
!       This generates a tree.  n is a small positive integer
!	specifying an upper bound on the number of nodes
!	of the tree.  The nodes can have two children, and
!	an information field.  The information field is 
!*      given a sequential node number.                    *
!* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
RECURSIVE FUNCTION GENTREE(N, NUMNODE) RESULT (T)
	USE TREENODE
	IMPLICIT NONE
	INTEGER N, NUMNODE
	TYPE (NODE), POINTER ::T
	ALLOCATE(T)
	NUMNODE=NUMNODE+1 !numnode is the unique number
		          !stored in each node after its creation
	T%INFO = NUMNODE
	IF (N<=2) THEN
	   NULLIFY(T%LEFT)
	ELSE      
	   T%LEFT => GENTREE(N/2,NUMNODE)
	END IF
	IF (n<=2) THEN
	   NULLIFY(T%RIGHT)
	ELSE	
	   T%RIGHT => GENTREE(N/2,NUMNODE)
	END IF
END

!* * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
!*      S U B R O U T I N E    T R E E P R I N T         *
!*	The information fields of the nodes of a tree
!	are printed so that the tree is rotated 90 degrees
!	counter-clockwise.  The nodes are given proper 
!*	depths.                                          *
!* * * * * * * * * * * * * * * * * * * * * * * * * * * * *
RECURSIVE SUBROUTINE TREEPRINT(T, COUNT)
	USE TREENODE
	IMPLICIT NONE
	TYPE (NODE), POINTER :: T
	INTEGER COUNT, I
	COUNT = COUNT+1
                 !count serves as a counter of the depth
		 !of the node and permits the correct
		 !spacing before the node contents are printed.
	IF (ASSOCIATED(T)) THEN
		CALL TREEPRINT(T%RIGHT,COUNT)
		WRITE(6,*)("         ", i=0,COUNT-1), T%INFO
		CALL TREEPRINT(T%LEFT,COUNT)
	END IF
	COUNT=COUNT-1
END
