program B_Tree; Uses Crt, Graph; Type TType = Char; PTTree = ^TTree; TTree = Record Data: TType; Left, Right: PTTree; End; procedure PrintTreeGraph(root: pttree); Function Convert(X: TType): String; Begin Convert := X; End; var start_x, start_y: integer; const delx = 30; dely = 20; circle_r = 10; btw = circle_r div 2; procedure print_node(T: pttree; level: integer; L, C, R: integer); function min(a, b: integer): integer; begin min := a; if b < a then min := b end; function Center(a, b: integer): integer; begin Center := min( a, B ) + abs( a - B ) div 2; end; var pos_y: integer; begin pos_y := start_y + pred(level) * dely; if T^.right <> nil then begin line(C, pos_y, Center(C, R), pos_y + dely); { вот тут мы предотвращаем наложение (уходим чуть вправо) } print_node(T^.right, level + 1, C+btw, Center(C+btw, R-btw), R-btw); end; if T^.left <> nil then begin line(C, pos_y, Center(L, C), pos_y + dely); { и вот тут тоже (уходим левее) } print_node(T^.left, level + 1, L+btw, Center(L+btw, C-btw), C-btw); end; setcolor(black); setfillstyle(solidfill, black); pieslice(C, pos_y, 0, 359, circle_r); setcolor(white); circle(C, pos_y, circle_r); settextjustify(centertext, centertext); outtextxy(C, pos_y, Convert(t^.data)); end; begin start_x := getmaxx div 2; start_y := 10; print_node(root, 1, 0, getmaxx div 2, getmaxx); end; function resultat (root:PTTree):real; function Encode (data: char): real; var x: real; begin write (data,' = '); readln (x); encode:= x; end; begin if root=nil then exit; case root^.data of '+': resultat:= resultat(root^.left) + resultat(root^.right); '-': resultat:= resultat(root^.left) - resultat(root^.right); '*': resultat:= resultat(root^.left) * resultat(root^.right); '/': if resultat(root^.right) = 0 then begin resultat:=0; write ('Error'); end else resultat:= resultat(root^.left) / resultat(root^.right); else resultat:= encode (root^.data); end end; var global_root: pttree; Procedure Build(Var root: PTTree; Expr: String; Var Shift: Integer); Begin New(root); Root^.Data := Expr[Shift]; Root^.Left := nil; Root^.Right := nil; If (Expr[Shift] in ['+','*','-','/']) Then Begin Inc(Shift); Build(Root^.Left, Expr, Shift); Build(Root^.Right, Expr, Shift); End Else Inc(Shift) End; Const i: integer = 1; Var s: string; grDriver: integer; grMode: integer; ErrCode: Integer; begin global_root := nil; writeln ('Vvedite virazenie v prefixnoy forme: '); readln (s); Build(global_root, s, i); grDriver := Detect; InitGraph(grDriver, grMode,''); ErrCode := GraphResult; if ErrCode <> grOk then begin Writeln('Graphics error:', GraphErrorMsg(ErrCode)); Halt(100); end; PrintTreeGraph(global_root); readln; CloseGraph; writeln (resultat(global_root):2:3); readln; end.