Вы находитесь на странице: 1из 30

Arboles en C++

rboles
Generalidades
Estructura De Datos NO Lineales
Las estructuras dinmicas lineales de datos listas, pilas y colas tienen
grandes enta!as de "e#ibilidad sobre las representaciones contiguas$ %in
embargo, tienen un punto d&bil' %ON L(%)A% %EC*ENC(ALE%
EN LA% E%)+*C)*+A% DE DA)O% NO L(NEALE% CADA ELE,EN)O -*EDE
)ENE+ D(.E+EN)E% /%(G*(EN)E%0 ELE,EN)O%, 1*E (N)+OD*CEN EL
CONCE-)O DE 2(.*+CAC(3N
)erminolog4a y +epresentaci5n de un rbol general
La representaci5n y terminolog4a de los rboles se reali6a con las t4picas
notaciones de las relaciones 7amiliares en los rboles geneal5gicos' -adre,
8i!o, 8ermano, Ascendente, Descendente, etc9
Las de:niciones a tener en cuenta son'
+a46 del rbol9 )odos los rboles ;ue no estn ac4os tienen un <nico nodo
ra469 )odos los dems elementos o nodos se derian o descienden de &l9 El
nodo ra46 no tiene padre es decir, no es el =i!o de ning<n elemento9
Nodo, son los &rtices o elementos del rbol9
Nodo terminal u =o!a >lea7 node? es a;uel nodo ;ue no contiene ning<n
subrbol9
A cada nodo ;ue no es =o!a se asocia uno o arios subrboles llamados
descendientes >o@spring? o =i!os9 De igual 7orma tiene asociado un
antecesor o ascendiente llamado padre9
Los nodos de un mismo padre se llaman =ermanos9
Los nodos con uno o dos subrboles no son =o!as ni ra46 se llaman
nodos interiores o internos9
*na colecci5n de dos o ms rboles se llama bos;ue >7orest?9
)odos los nodos tienen un solo padre e#cepto la ra46 ;ue no tiene
padre9
%e denomina camino el enlace entre dos nodos consecutios, y rama es un
camino ;ue termina en una =o!a9
Cada nodo tiene asociado un n<mero de niel ;ue se determina por la
longitud del camino desde la ra46 al nodo espec4:co9
La altura o pro7undidad de un rbol es el n<mero m#imo de nodos de una
rama9 E;uiale al niel ms alto de los nodos ms uno9 El peso de un rbol
es el n<mero de nodos terminales9
+epresentaci5n de un rbol con punteros
rboles 2inarios
Generalidades
*n rbol binario es un con!unto :nito de cero o ms nodos tales ;ue'
E#iste un nodo denominado ra46 del rbol9
Cada nodo puede tener A, B 5 C subrboles, conocidos como subrbol
i6;uierdo y subrbol derec=o9
E!emplos de rboles binarios
+ecorrido de un rbol
%e denomina recorrido de un rbol al proceso ;ue permite acceder de una
sola e6 a cada uno de los nodos del rbol9 Cuando un rbol se recorre, el
con!unto completo de nodos se e#amina9
E#isten muc=os modos para recorrer un rbol binario9 -or e!emplo e#isten
seis di7erentes recorridos generales en un rbol binario, sim&trico dos a
dos9
Los algoritmos de recorrido de un rbol binario presentan tres tipos de
actiidades comunes'
Disitar el nodo ra469
+ecorrer el subrbol i6;uierdo9
+ecorrer el subrbol derec=o9
Estas tres acciones repartidas en di7erentes 5rdenes proporcionan los
di7erentes recorridos del rbol9 Los ms 7recuentes tienen siempre en
com<n recorrer primero el subrbol i6;uierdo y luego el subrbol derec=o9
Los algoritmos anteriores se llaman preEorden, postEorden, inEorden, y su
nombre re"e!a el momento en ;ue se isita el nodo ra469 En el inEorden el
ra46 est en el medio del recorrido, en el preEorden el ra46 est primero y
en el postEorden el ra46 est el <ltimo9
+ecorrido preEorden'
Disitar el ra469
+ecorrer el subrbol i6;uierdo en preEorden9
+ecorrer el subrbol derec=o en preEorden9
+ecorrido enEorden'
+ecorrer el subrbol i6;uierdo en inEorden9
Disitar el ra469
+ecorrer el subrbol derec=o en inEorden9
+ecorrido postEorden'
+ecorrer el subrbol i6;uierdo en postEorden9
+ecorrer el subrbol derec=o en postEorden9
Disitar el ra469
Obs&rese ;ue todas estas de:niciones tienen naturale6a recursia9
>+ecursia' .unci5n o -rocedimiento ;ue se llama a s4 mismo?
+2OL 2(NA+(O DE 2F%1*EDA
El rbol 2inario de 2<s;ueda >binary searc= tree? se construir teniendo
en cuenta las siguientes premisas'
El primer elemento se utili6a para crear el nodo ra469
Los alores del rbol deben ser tales ;ue pueda e#istir un orden9
En cual;uier nodo todos los alores del subrbol i6;uierdo del nodo son
menores o iguales al alor del nodo9 De modo similar, todos los alores del
subrbol derec=o deben ser mayores ;ue los alores del nodo9
%i estas condiciones se mantienen, es sencillo probar ;ue el recorrido inE
orden del rbol produce los alores clasi:cados por orden9
%upongamos ;ue disponemos de los siguientes datos'
D . E 2 A C G
-ara construir un rbol binario de b<s;ueda se procede de la siguiente
manera'
Nodo ra46 del rbol' D9
El siguiente elemento se conierte en el descendente derec=o, dado ;ue .
al7ab&ticamente es mayor ;ue D9
A continuaci5n, se compara E con el ra469 Dado ;ue E es mayor ;ue D,
pasar a ser un =i!o de . y como E G . ser el =i!o i6;uierdo9
El siguiente elemento 2 se compara con el ra46 D y como 2 G D, y es el
primer elemento ;ue cumple esta condici5n, 2 ser el =i!o i6;uierdo de D9
%e repiten los pasos =asta el <ltimo elemento9
El rbol binario de b<s;ueda resultante ser4a'
2<s;ueda de un elemento
(nsertar un Elemento
-ara insertar un elemento en el rbol, se =a de comprobar, en primer
lugar, ;ue el elemento no se encuentra en el rbol, ya ;ue en su caso no
precisa ser insertado9 %i el elemento no e#iste, la inserci5n se reali6a en
un nodo en el ;ue al menos uno de los dos punteros (H1 o DE+ tenga alor
N(L9
-ara reali6ar la condici5n anterior se desciende en el rbol a partir del
nodo ra46, dirigi&ndose de i6;uierda a derec=a de un nodo, seg<n ;ue el
alor a insertar sea in7erior o superior al alor del campo clae (N.O de
este nodo9 Cuando se alcan6a un nodo del rbol en ;ue no se puede
continuar, el nueo elemento se enganc=a a la i6;uierda o derec=a de este
nodo en 7unci5n de ;ue su alor sea in7erior o superior al del nodo
alcan6ado9
Eliminaci5n de un elemento
La eliminaci5n de un elemento debe conserar el orden de los elementos
del rbol9 %e consideran di7erentes casos, seg<n la posici5n del elemento
o nodo en el rbol'
%i el elemento es una =o!a se suprime simplemente y se marca nulo en el
padre9
%i el elemento no tiene ms ;ue un descendiente, se sustituye entonces
este por su descendiente
%i el elemento tiene dos descendientes, se sustituye por el elemento
inmediato in7erior situado lo ms a la derec=a posible de su subrbol
i6;uierdo9
-ara poder reali6ar estas acciones, ser preciso conocer la siguiente
in7ormaci5n del nodo a eliminar'
I Conocer su posici5n en el rbol
I Conocer la direcci5n de su padre
I Conocer si el nodo a eliminar tiene =i!os, si son uno o dos =i!os, y en el
caso ;ue sea solo uno, si es =i!o i6;uierdo o derec=o9
Casos posibles de eliminaci5n de un nodo
Eliminaci5n de un nodo con un subrbol
Eliminaci5n de un nodo con dos subrboles no nulos
(mplementaci5n de las 7unciones con punteros
JJDeclaraciones generales
Estructura tipoKnombre
LLLL99
LLLL99
tipoKnombre i6;, der
.in de estructura
tipoKnombre M elemento, au#, cabecera,ant,au#C,antC
l5gica 7unci5n buscar>elemento?
antNN*LL
au# N cabecera
mientras>au#?
si>elementoNau#EOelemento?
retornar>erdadero?
si no
antNau#
si>elementoOau#EOelemento?
au#Nau#EOder
si no
au#Nau#EOi6;
:n si
:n si
:n mientras
retornar>7also?
:n 7unci5n
7uncion insertar>elemento?
si >Pbuscar>elemento??
au#Nreserar>tipoKdato?
au#EOelementoNelemento
si>elementoOantEOelemento?
antEOderNau#
si no
antEOi6;Nau#
:n si
:n si
:n 7uncion
7uncion buscmenmay
au#CNau#EOder$
antCNau#$
mientras>au#CEOi6;?
antCNau#C$
au#CNau#EOi6;$
:n mientras
au#EOelementoNau#CEOelemento
liberar>au#C?
antCEOi6;NN*LL
:n 7uncion
7uncion buscmaymen
au#CNau#EOi6;$
antCNau#$
mientras>au#CEOder?
antCNau#C$
au#CNau#EOder$
:n mientras
au#EOelementoNau#CEOelemento
liberar>au#C?
antCEOderNN*LL
:n 7uncion
7uncion eliminar>elemento?
buscar>elemento? JJen au# esta elemento
si>au#EOderNNN*LL QQ au#EOi6;NNN*LL?
si>antEOelementoOelemento?
antEOi6;NN*LL
sino
antEOderNN*LL
:n si
eliminar>au#?
sino
si>au#EOderPNN*LL?
buscmenmay
sino
buscmaymen
:n si
:n si
:n 7uncion
E!emplo de Arbol'
B
C
R
S
T
U
V
W
X
BA
BB
BC
BR
BS
BT
BU
BV
BW
BX
CA
CB
CC
CR
Yinclude Giostream9=O
Yinclude Gconio9=O

struct arbol
Z
int dato$
arbol [i,[d$
\[elemento, [au#, [cabecera, [ant,
[au#C, [antC$

int dato$

int buscar>oid?$
oid insertar>oid?$
oid buscarmenmay>oid?$
oid buscarmaymen>oid?$
oid eliminar>oid?$

oid main>oid?
Z
int y,opc$
do
Z
CS
CT
CU
CV
CW
CX
RA
RB
RC
RR
RS
RT
RU
RV
RW
RX
SA
SB
SC
SR
SS
ST
SU
SV
SW
SX
clrscr>?$
yNBA$
goto#y>BA,y++?$
coutGG]A E %alir]$
goto#y>BA,y++?$
coutGG]B E 2uscar]$
goto#y>BA,y++?$
coutGG]C E (nsertar]$
goto#y>BA,y?$
coutGG]R E 2orrar]$
goto#y>BA,y+NT?$
coutGG]Cual es su opcion' ]$
cinOOopc$
s^itc=>opc?
Z
case A' brea_$
case B' coutGG]`n`nDato a buscar'
]$
cinOOdato$
i7>buscar>??
coutGG]`n`nDato e#iste]$
else
coutGG]`n`nDato ine#istente]$
brea_$
case C' coutGG]`n`nDato a insertar'
]$
cinOOdato$
TA
TB
TC
TR
TS
TT
TU
TV
TW
TX
UA
UB
UC
UR
US
UT
UU
UV
UW
UX
VA
VB
VC
VR
VS
VT
insertar>?$
coutGG]`n`nDato (nsertado]$
brea_$
case R' coutGG]`n`nDato a borrar'
]$
cinOOdato$
eliminar>?$
brea_$
de7ault' coutGG]`n`nOpcion
incorrecta]$
\
i7>opc? getc=>?$
\^=ile>opc?$
\

int buscar>oid?
Z
i7>Pcabecera?
Z
coutGG]No =ay arbol]$
return>A?$
\
antNN*LL$
au#Ncabecera$
^=ile>au#?
Z
i7 >datoNNau#EOdato?
VU
VV
VW
VX
WA
WB
WC
WR
WS
WT
WU
WV
WW
WX
XA
XB
XC
XR
XS
XT
XU
XV
XW
XX
BA
A
BA
return>B?$
else
Z
antNau#$
i7 >datoOau#EOdato?
au#Nau#EOd$
else
au#Nau#EOi$
\
\
return>A?$
\

oid insertar>oid?
Z
i7>Pcabecera?
Z
cabeceraNne^>arbol?$
cabeceraEOdatoNdato$
cabeceraEOdNN*LL$
cabeceraEOiNN*LL$
return$
\
i7 >Pbuscar>??
Z
au#Nne^>arbol?$
B
BA
C
BA
R
BA
S
BA
T
BA
U
BA
V
BA
W
BA
X
BB
A
BB
B
BB
C
BB
R
BB
S
BB
T
BB
U
BB
V
au#EOdatoNdato$
au#EOiNN*LL$
au#EOdNN*LL$
i7>datoOantEOdato?
antEOdNau#$
else
antEOiNau#$
\
else
coutGG]`n`nDato e#istente]$
\

oid buscarmenmay>oid?
Z
au#CNau#EOd$
antCNau#$
^=ile>au#CEOi?
Z
antCNau#C$
au#CNau#CEOi$
\
au#EOdatoNau#CEOdato$
i7>au#CEOd?
antCEOiNau#CEOd$
delete>au#C?$
antCEOdNN*LL$
BB
W
BB
X
BC
A
BC
B
BC
C
BC
R
BC
S
BC
T
BC
U
BC
V
BC
W
BC
X
BR
A
BR
B
BR
C
BR
R
BR
\

oid buscarmaymen>oid?
Z
au#CNau#EOi$
antCNau#$
^=ile>au#CEOd?
Z
antCNau#C$
au#CNau#CEOd$
\
au#EOdatoNau#CEOdato$
i7>au#CEOi?
antCEOdNau#CEOi$
delete>au#C?$
antCEOiNN*LL$
\

oid eliminar>oid?
Z
i7>Pbuscar>??
Z
coutGG]`n`nElemento no
encontrado9]$
return$
\
i7>au#EOdNNN*LL QQ au#E
S
BR
T
BR
U
BR
V
BR
W
BR
X
BS
A
BS
B
BS
C
BS
R
BS
S
BS
T
BS
U
BS
V
BS
W
BS
X
BT
OiNNN*LL?
Z
i7>antEOdatoOdato?
antEOiNN*LL$
else
antEOdNN*LL$
delete>au#?$
\
else
i7>au#EOdPNN*LL?
buscarmenmay>?$
else
buscarmaymen>?$
coutGG]`n`nElemento 2orrado]$
\
A
BT
B
BT
C
BT
R
BT
S
BT
T
BT
U
BT
V
BT
W
BT
X
BU
A
BU
B
BU
C
BU
R
BU
S
BU
T
OtroJJJJJJJJJJJJJJJJJJJJJJJJJ
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
struct nodoarbol{
struct nodoarbol *izqnodo;
int info;
char letra;
struct nodoarbol *dernodo;
};
typedef struct nodoarbol NOO;
typedef NOO *!"#O$;
%oid insertanodonue%o&!"#O$ *' int'char(;
%oid inorden &!"#O$(;
%oid preorden &!"#O$(;
%oid postorden &!"#O$(;
%oid treefree &!"#O$(;
)ain&(
{
int i' n' ele)entos;
char ne*nod' chain;
!"#O$ raiz+N,$$;
printf&-.n.n/uantos nodos desea agregar0 -(;
scanf&-1d-'2n(;
for &i+3;i<n;i44(
{
fflush&stdin(;
printf&-.n5ntroduce nu)ero0 -(;
scanf&-1d-'2ele)entos(;
fflush&stdin(;
printf&-5ntroduce letra0 -(;
scanf&-1c-'2chain(;
insertanodonue%o&2raiz'ele)entos'chain(;
}
syste)&-cls-(;
printf&-.n.n6reorden0 -(;
preorden&raiz(;
printf&-.n.n5norden0 -(;
inorden&raiz(;
printf&-.n.n6ostOrden0 -(;
postorden&raiz(;
getch&(;
treefree&raiz(;
raiz+N,$$;
return 3;
}
%oid insertanodonue%o&!"#O$ *rarbol' int nue%o'char l(
{
if &*rarbol++N,$$(
{
*rarbol+&NOO *()alloc&sizeof&NOO((;
if&*rarbol7+N,$$(
{
&*rarbol(8>info+nue%o;
&*rarbol(8>letra+l;
&*rarbol(8>izqnodo+N,$$;
&*rarbol(8>dernodo+N,$$;
}
else {printf&-.n9:9O"5! NO 5;6ON5#$:.n-(;}
}
else
if&nue%o<&*rarbol(8>info(
insertanodonue%o&2&&*rarbol(8>izqnodo('nue%o'l(;
else
if&nue%o>&*rarbol(8>info(
insertanodonue%o&2&&*rarbol(8>dernodo('nue%o'l(;
}
%oid preorden &!"#O$ rarbol(
{
if&rarbol7+N,$$(
{
printf&-1d-'rarbol8>info(;
printf&-1c-'rarbol8>letra(;
preorden&rarbol8>izqnodo(;
preorden&rarbol8>dernodo(;
}
}
%oid inorden&!"#O$ rarbol(
{
if&rarbol7+N,$$(
{
inorden&rarbol8>izqnodo(;
printf&-1d-' rarbol8>info(;
printf&-1c-'rarbol8>letra(;
inorden&rarbol8>dernodo(;
}
}
%oid postorden&!"#O$ rarbol(
{
if&rarbol7+N,$$(
{
postorden&rarbol8>izqnodo(;
postorden&rarbol8>dernodo(;
printf&-1d-' rarbol8>info(;
printf&-1c-'rarbol8>letra(;
}
}
%oid treefree&!"#O$ rarbol(
{
if&rarbol7+N,$$(
{
treefree &rarbol8>izqnodo(;
treefree&rarbol8>dernodo(;
treefree &rarbol(;
}
}
rbol binario
<. == )ain.cpp0 #inary >ree
?. == #y @;hallo* = #lipiA
B. #include <stdio.h>
C. #include <stdlib.h>
D. #include <string.h>
E.
F. #define N,9GO6:"!>O"; E
H. const char *operators@A + {
I. -4-'
<3. -8-'
<<. -=-'
<?. -*-'
<B. -&-'
<C. -(-'
<D. };
<E. #define O6:NG6!"!N>J:;5; C
<F. #define /$O;:G6!"!N>J:;5; D
<H.
<I.
?3. int isOperator&char *op({
?<. for&int i + 3; i < N,9GO6:"!>O";; i44(
??. if&strc)p&operators@iA' op( ++ 3(
?B. return i;
?C.
?D. return 8<;
?E. }
?F. int isOperator&char op({
?H. for&int i + 3; i < N,9GO6:"!>O";; i44(
?I. if&operators@iA@3A ++ op(
B3. return i;
B<.
B?. return 8<;
BB. }
BC.
BD. class tree{
BE. pri%ate0
BF. char *data;
BH.
BI. tree *left;
C3. tree *right;
C<. tree *top;
C?.
CB. public0
CC.
CD. tree&({
CE. left + N,$$;
CF. right + N,$$;
CH. top + N,$$;
CI. data + N,$$;
D3. }
D<.
D?. char *getata&({ return data; }
DB. tree *get$eft&({ return left; }
DC. tree *get"ight&({ return right; }
DD. tree *get>op&({ return top; }
DE.
DF. tree *e%aluate!nd;et&char *buffer({
DH. int isOp + isOperator&buffer(;
DI.
E3. if&isOp >+ 3({
E<. if&isOp ++ O6:NG6!"!N>J:;5;({
E?. tree *ne*>ree + ne* tree&(;
EB. ne*>ree8>top + this;
EC. if&7this8>left(
ED. this8>left + ne*>ree;
EE. else if&7this8>right(
EF. this8>right + ne*>ree;
EH. ==else
EI. ==printf&-:""O"..n-(;
F3.
F<. return ne*>ree;
F?. }else if&isOp ++ /$O;:G6!"!N>J:;5;({
FB. tree *te)p>ree + this;
FC. *hile&te)p>ree8>top({
FD. if&7te)p>ree8>top8>data(
FE. return te)p>ree8
>top;
FF. te)p>ree + te)p>ree8>top;
FH. }
FI.
H3. tree *top>ree + ne* tree&(;
H<. te)p>ree8>top + top>ree;
H?. top>ree8>left + te)p>ree;
HB.
HC. return top>ree;
HD. }else if&7this8>data({
HE.
HF. this8>data + ne*
char@strlen&buffer(A;
HH. strcpy&this8>data' buffer(;
HI.
I3. return this;
I<. }else{
I?. tree *top>ree + ne* tree&(;
IB. this8>top + top>ree;
IC. top>ree8>left + this;
ID.
IE. top>ree8>data + ne*
char@strlen&buffer(A;
IF. strcpy&top>ree8>data' buffer(;
IH.
II. return top>ree;
<33. }
<3<. }else{
<3?. tree *%al>ree + ne* tree&(;
<3B. %al>ree8>top + this;
<3C.
<3D. %al>ree8>data + ne* char@strlen&buffer(A;
<3E. strcpy&%al>ree8>data' buffer(;
<3F.
<3H. if&7this8>left(
<3I. this8>left + %al>ree;
<<3. else
<<<. this8>right + %al>ree;
<<?.
<<B. return this;
<<C. }
<<D. }
<<E.
<<F. };
<<H.
<<I. %oid build>ree&char *instruction' tree *)ain>ree({
<?3. int len + strlen&instruction(;
<?<. int init + 3;
<??. int i#uff + 3;
<?B.
<?C. char buffer@H<I?A;
<?D.
<?E. for&int i + 3; i <+ len; i44({
<?F. char c + instruction@iA;
<?H.
<?I. bool isOp + &&isOperator2copy; >+ 3(Ktrue0false(;
<B3.
<B<. ==:li)inar espacios
<B?. if&init ++ 3 22 c ++ L L(
<BB. continue;
<BC. else if& & init ++ < 22 &c ++ L L MM c ++
L..3L MM c ++ L..nL( (
<BD. MM isOp
<BE. ({
<BF. ==:nd buffer;
<BH.
<BI. e%aluateGchar0
<C3. if&7isOp MM & isOp 22 buffer@3A 7+ 3 ( ({
<C<. buffer@i#uffA + L..3L;
<C?.
<CB. )ain>ree + )ain>ree8
>e%aluate!nd;et&buffer(;
<CC.
<CD. )e)set&buffer' 3' H<I?(;
<CE. i#uff + 3;
<CF. init + 3;
<CH. }
<CI.
<D3. if&isOp({
<D<. buffer@i#uff44A + c;
<D?. isOp + false;
<DB. goto e%aluateGchar;
<DC. }
<DD. }else if&c 7+ L L({
<DE. ==!dd to buffer
<DF. init + <;
<DH. buffer@i#uff44A + c;
<DI. }
<E3.
<E<. }
<E?. }
<EB.
<EC. tree *seeN>op&tree *)ain>ree({
<ED. *hile&)ain>ree8>get>op&((
<EE. )ain>ree + )ain>ree8>get>op&(;
<EF.
<EH. *hile&7)ain>ree8>getata&((
<EI. )ain>ree + )ain>ree8>get$eft&(;
<F3.
<F<. return )ain>ree;
<F?. }
<FB.
<FC. %oid %ie*>ree&tree *)ain>ree({
<FD. if&)ain>ree8>get$eft&((
<FE. %ie*>ree&)ain>ree8>get$eft&((;
<FF. if&)ain>ree8>get"ight&((
<FH. %ie*>ree&)ain>ree8>get"ight&((;
<FI.
<H3. printf&->"::0 1s..n-' )ain>ree8>getata&((;
<H<. }
<H?.
<HB. double e%aluate>ree&tree *)ain>ree({
<HC. char *r + )ain>ree8>getata&(;
<HD.
<HE. if&isOperator2reg; >+ 3({
<HF. double leftOal + e%aluate>ree& )ain>ree8>get$eft&(
(;
<HH. double rightOal + e%aluate>ree& )ain>ree8>get"ight&( (;
<HI.
<I3. printf&-O60 1f 1c 1f..n-' leftOal' r@3A'
rightOal(;
<I<. s*itch & r@3A ( {
<I?. case L4L0 return leftOal 4 rightOal;
<IB. case L8L0 return leftOal 8 rightOal;
<IC. case L*L0 return leftOal * rightOal;
<ID. case L=L0 return leftOal = rightOal;
<IE. }
<IF. }else{
<IH. return atof&)ain>ree8>getata&((;
<II. }
?33. }
?3<.
?3?. int )ain&(
?3B. {
?3C. tree *)ain>ree + ne* tree&(;
?3D. char ins@A + -?.D*&B4<(*&?*&<4<((-;
?3E. build>ree&ins' )ain>ree(;
?3F.
?3H. )ain>ree + seeN>op&)ain>ree(;
?3I. %ie*>ree&)ain>ree(;
?<3.
?<<. double result + e%aluate>ree&)ain>ree(;
?<?. printf&-..n-(;
?<B. printf&-":;,$>0 1f..n-' result(;
?<C.
?<D. fflush&stdin(;
?<E. getchar&(;
?<F. return 3;
?<H. }