PROGRAM Tree (Input, Output);
{Written by Jason John Schwarz with Turbo Pascal v6.0.
Purpose: A demonstration binary tree.}

USES CRT;

TYPE
    Point = ^Node;
    Node = RECORD
           Data : REAL;
           Left : Point;
           Right : Point;
    END;{Node}

VAR
   Root : Point;

PROCEDURE Initialize;
BEGIN
     Root:=NIL;
END;{Initialize}

PROCEDURE Create (Data : REAL);
BEGIN
     NEW(Root);
     Root^.Data:=Data;
     Root^.Left:=NIL;
     Root^.Right:=NIL;
END;{Create}

PROCEDURE AddNode (Data :REAL; Root : Point);
VAR
   Temp : Point;
BEGIN
     NEW(Temp);
     IF Data>=Root^.Data THEN Root^.Right:=Temp;
     IF Data<Root^.Data THEN Root^.Left:=Temp;
     Temp^.Data:=Data;
     Temp^.Left:=NIL;
     Temp^.Right:=NIL;
END;{AddNode}

PROCEDURE Add (Data : REAL; Root : Point);
BEGIN
     IF Root=NIL THEN Create(Data) ELSE BEGIN
           IF (Data>=Root^.Data) THEN
              IF Root^.Right<>NIL THEN Add(Data,Root^.Right)
              ELSE AddNode(Data,Root);
           IF (Data<Root^.Data) THEN
              IF Root^.Left<>NIL THEN Add(Data,Root^.Left)
              ELSE AddNode(Data,Root);
     END;{Root=NIL}
END;{Add}

PROCEDURE InOrder (Root : Point);
BEGIN
     IF Root <> NIL THEN BEGIN
        InOrder(Root^.Left);
        WRITELN(Root^.Data);
        InOrder(Root^.Right);
     END;{Root<>NIL}
END;{InOrder}

PROCEDURE PreOrder (Root : Point);
BEGIN
     IF Root <> NIL THEN BEGIN
        WRITELN(Root^.Data);
        PreOrder(Root^.Left);
        PreOrder(Root^.Right);
     END;{Root<>NIL}
END;{PreOrder}

PROCEDURE PostOrder (Root : Point);
BEGIN
     IF Root<>NIL THEN BEGIN
        PostOrder(Root^.Left);
        PostOrder(Root^.Right);
        WRITELN(Root^.Data);
     END;{Root<>NIL}
END;{PostOrder}

PROCEDURE GetData;
VAR Data : REAL;
BEGIN
     WRITE(Output,'What is the new number?');
     READLN(Input,Data);
     Add(Data,Root);
END;{GetData}

PROCEDURE Loop;
VAR
   Choice : CHAR;
BEGIN
     REPEAT
           Choice:=CHR(0);
           GetData;
           CLRSCR;
           WRITELN(Output,'InOrder Tree:');
           InOrder(Root);
           WRITELN(Output,'PostOrder Tree:');
           PostOrder(Root);
           WRITELN(Output,'PreOrder Tree:');
           PreOrder(Root);
           WRITE(Output,'Do you wish to add another number?');
           READLN(Input,Choice);
     UNTIL Choice IN ['N','n'];
END;{Loop}

BEGIN
     Initialize;
     Loop;
END.
