Tre
es
Lin
ea
r V
s n
on
-lin
ea
r d
ata
str
uct
ure
s
Typ
es
of
bin
ary
tre
es
Bin
ary
tre
e t
rave
rsa
ls
Re
pre
sen
tati
on
s o
f a
bin
ary
tre
e
Bin
ary
tre
e A
DT
Bin
ary
se
arc
h t
ree
EE
CS
26
8 P
rogra
mm
ing I
I 1
Ove
rvie
w
We
ha
ve d
iscu
sse
d l
ine
ar
da
ta s
tru
ctu
res
arr
ays
, li
nke
d lis
ts,
sta
cks,
qu
eu
es
So
me
oth
er
da
ta s
tru
ctu
res
we
wil
l co
nsi
de
r
tre
es,
ta
ble
s, g
rap
hs,
ha
sh-t
ab
les
Tre
es
are
ext
rem
ely
use
ful a
nd
su
ita
ble
fo
r a
wid
e
ran
ge
of
ap
pli
cati
on
s
sort
ing
, se
arc
hin
g,
exp
ress
ion
eva
lua
tio
n,
da
ta s
et
rep
rese
nta
tio
n
esp
eci
all
y w
ell
su
ite
d t
o r
ecu
rsiv
e a
lgo
rith
m
imp
lem
en
tati
on
E
EC
S 2
68 P
rogra
mm
ing I
I 2
Term
ino
log
y
A T
ree
T i
s a
se
t o
f n
>=
0 e
lem
en
ts:
if n
==
0,
T is
an
em
pty
tre
e
if n
> 0
th
en
th
ere
exi
sts
som
e e
lem
en
t ca
lle
d r
T
ca
lle
d t
he
ro
ot
of
T s
uch
th
at
T -
{r}
ca
n b
e p
art
itio
ne
d
into
ze
ro o
r m
ore
dis
join
t se
ts T
1 ,T
2 ,
...
wh
ere
ea
ch
sub
set
form
s a
tre
e
Tre
es
are
co
mp
ose
d o
f n
od
es
an
d e
dg
es
Tre
es
are
hie
rarc
hic
al
pa
ren
t-ch
ild
re
lati
on
ship
be
twe
en
tw
o n
od
es
an
cest
or-
de
sce
nd
an
t re
lati
on
ship
s a
mo
ng
no
de
s
Su
btr
ee
of
a t
ree
: A
ny
no
de
an
d i
ts d
esc
en
da
nts
3
EE
CS
26
8 P
rogra
mm
ing I
I
Term
ino
log
y
4
Fig
ure
10
-1 A
ge
ne
ral t
ree
F
igu
re 1
0-2
A s
ub
tre
e o
f th
e tre
e in
Fig
ure
10
-1
EE
CS
268 P
rogra
mm
ing I
I
Term
ino
log
y
Pa
ren
t o
f n
od
e n
Th
e n
od
e d
ire
ctly
ab
ove
no
de
n i
n t
he
tre
e
Ch
ild
of
no
de
n
A n
od
e d
ire
ctly
be
low
no
de
n i
n t
he
tre
e
Ro
ot
Th
e o
nly
no
de
in
th
e t
ree
wit
h n
o p
are
nt
Su
btr
ee
of
no
de
n
A t
ree
th
at
con
sist
s o
f a
ch
ild
(if
an
y)
of
no
de
n
5
EE
CS
26
8 P
rogra
mm
ing I
I
Term
ino
log
y
Lea
f
A n
od
e w
ith
no
ch
ild
ren
Sib
lin
gs
No
de
s w
ith
a c
om
mo
n p
are
nt
An
cest
or
of
no
de
n
A n
od
e o
n t
he
pa
th f
rom
th
e r
oo
t to
n
De
sce
nd
an
t o
f n
od
e n
A n
od
e o
n a
pa
th f
rom
n t
o a
le
af
6
EE
CS
268 P
rogra
mm
ing I
I
A B
ina
ry T
ree
A b
ina
ry t
ree
is a
se
t T
of
no
de
s su
ch t
ha
t
T i
s e
mp
ty,
or
T i
s p
art
itio
ne
d i
nto
th
ree
dis
join
t su
bse
ts:
a s
ing
le n
od
e r
, th
e r
oo
t
two
po
ssib
ly e
mp
ty s
ets
th
at
are
bin
ary
tre
es,
ca
lle
d
the
le
ft s
ub
tre
e o
f r
an
d t
he
rig
ht
sub
tre
e o
f r
Bin
ary
tre
es
are
ord
ere
d
Th
ese
tre
es
are
no
t e
qu
al
7
EE
CS
26
8 P
rogra
mm
ing I
I
A
B
B
A
R
L
A G
en
era
l Tr
ee
& A
Bin
ary
Tre
e
8
EE
CS
268 P
rogra
mm
ing I
I
Mo
re B
ina
ry T
ree
s
9
Fig
ure
10
-4 B
ina
ry tre
es th
at re
pre
se
nt a
lge
bra
ic e
xp
ressio
ns
A B
ina
ry S
ea
rch
Tre
e
A b
ina
ry s
ea
rch
tre
e is
a
bin
ary
tre
e t
ha
t h
as
the
fo
llo
win
g p
rop
ert
ies
for
ea
ch n
od
e n
sub
tre
e T
L
sub
tre
e T
R
bo
th T
L a
nd
TR
are
bin
ary
se
arc
h t
ree
s
10
EE
CS
268 P
rogra
mm
ing I
I
Th
e H
eig
ht
of
Tre
es
He
igh
t o
f a
tre
e
Nu
mb
er
of
no
de
s a
lon
g t
he
lon
ge
st p
ath
fro
m t
he
ro
ot
to a
le
af
H
eig
ht
3
He
igh
t 5
H
eig
ht
7
11
Fig
ure
10
-6
Bin
ary
tre
es w
ith
the
sa
me
no
de
s b
ut
diffe
rent h
eig
hts
Th
e H
eig
ht
of
Tre
es
Leve
l o
f a
no
de
n i
n a
tre
e T
If n
is
the
ro
ot
of
T, i
t is
at
leve
l 1
If n
is
no
t th
e r
oo
t o
f T,
its
le
vel is
1 g
rea
ter
tha
n
the
le
vel o
f it
s p
are
nt
He
igh
t o
f a
tre
e T
de
fin
ed
in
te
rms
of
the
le
vels
of
its
no
de
s
If T
is
em
pty
, it
s h
eig
ht
is 0
If T
is
no
t e
mp
ty,
its
he
igh
t is
eq
ua
l to
th
e
ma
xim
um
le
vel o
f it
s n
od
es
12
EE
CS
268 P
rogra
mm
ing I
I
Th
e H
eig
ht
of
Tre
es
A r
ecu
rsiv
e d
efi
nit
ion
of
he
igh
t
If T
is
em
pty
, it
s h
eig
ht
is 0
If T
is
no
t e
mp
ty,
h
eig
ht(
T)
= 1
+ m
ax{
he
igh
t(T
L),
he
igh
t(T
R)}
r
/
\
T
L
TR
13
EE
CS
26
8 P
rogra
mm
ing I
I
Fu
ll B
ina
ry T
ree
s
A b
ina
ry t
ree
of
he
igh
t h
is
fu
ll i
f
No
de
s a
t le
vels
< h
ha
ve
two
ch
ild
ren
ea
ch
Re
curs
ive
de
fin
itio
n
If T
is
em
pty
, T
is
a f
ull
b
ina
ry t
ree
of
he
igh
t 0
If T
is
no
t e
mp
ty a
nd
ha
s h
eig
ht
h >
0,
T is
a f
ull
sub
tre
es
are
bo
th f
ull
b
ina
ry t
ree
s o
f h
eig
ht
h
1
14
Fig
ure
10
-7
A fu
ll b
ina
ry tre
e o
f h
eig
ht 3
Co
mp
lete
Bin
ary
Tre
es
A b
ina
ry t
ree
of
he
igh
t h
is
com
ple
te i
f
It i
s fu
ll t
o le
vel
h
1,
an
d
Leve
l h
is
fill
ed
fro
m l
eft
to
rig
ht
15
EE
CS
26
8 P
rogra
mm
ing I
I
Co
mp
lete
Bin
ary
Tre
es
An
oth
er
de
fin
itio
n:
A b
ina
ry t
ree
of
he
igh
t h
is
com
ple
te i
f
All
no
de
s a
t le
vels
<=
h
2 h
ave
tw
o c
hil
dre
n
ea
ch,
an
d
Wh
en
a n
od
e a
t le
vel h
1
ha
s ch
ild
ren
, a
ll n
od
es
to i
ts l
eft
at
the
sa
me
le
vel
ha
ve t
wo
ch
ild
ren
ea
ch,
an
d
Wh
en
a n
od
e a
t le
vel h
1
ha
s o
ne
ch
ild
, it
is
a
left
ch
ild
16
EE
CS
268 P
rogra
mm
ing I
I
Ba
lan
ced
Bin
ary
Tre
es
A b
ina
ry t
ree
is b
ala
nce
d i
f th
e h
eig
hts
of
an
y
Co
mp
lete
bin
ary
tre
es
are
ba
lan
ced
Fu
ll b
ina
ry t
ree
s a
re c
om
ple
te a
nd
ba
lan
ced
17
EE
CS
26
8 P
rogra
mm
ing I
I
Tra
vers
als
of
a B
ina
ry T
ree
A t
rave
rsa
l v
isit
s e
ach
no
de
in
a t
ree
to
do
so
me
thin
g w
ith
or
to t
he
no
de
du
rin
g a
vis
it
for
exa
mp
le,
dis
pla
y t
he
da
ta in
th
e n
od
e
Ge
ne
ral
form
of
a r
ecu
rsiv
e t
rave
rsa
l a
lgo
rith
m
traverse (in binTree:BinaryTree)
if (binTree is not empty)
{ traverse(Left subtree of
root)
traverse(Right subtree of
root)
}
18
EE
CS
268 P
rogra
mm
ing I
I
Tra
vers
als
of
a B
ina
ry T
ree
Pre
ord
er
tra
vers
al
Vis
it r
oo
t b
efo
re v
isit
ing
its
su
btr
ee
s
i. e
. B
efo
re t
he
re
curs
ive
ca
lls
Ino
rde
r tr
ave
rsa
l
Vis
it r
oo
t b
etw
ee
n v
isit
ing
its
su
btr
ee
s
i. e
. B
etw
ee
n t
he
re
curs
ive
ca
lls
Po
sto
rde
r tr
ave
rsa
l
Vis
it r
oo
t a
fte
r v
isit
ing
its
su
btr
ee
s
i. e
. A
fte
r th
e r
ecu
rsiv
e c
all
s
19
EE
CS
26
8 P
rogra
mm
ing I
I
Tra
vers
als
of
a B
ina
ry T
ree
20
Fig
ure
10-1
0
Tra
ve
rsa
ls o
f a
bin
ary
tre
e: (a
) p
reo
rde
r; (
b)
ino
rde
r; (
c)
po
sto
rder
EE
CS
268 P
rogra
mm
ing I
I
Tra
vers
als
of
a B
ina
ry T
ree
A t
rave
rsa
l o
pe
rati
on
ca
n c
all
a f
un
ctio
n t
o
pe
rfo
rm a
ta
sk o
n e
ach
ite
m i
n t
he
tre
e
the
cli
en
t d
efi
ne
s a
nd
pa
sse
s th
is f
un
ctio
n a
s a
n
arg
um
en
t to
th
e t
rave
rsa
l o
pe
rati
on
Tre
e t
rave
rsa
l o
rde
rs c
orr
esp
on
d t
o a
lge
bra
ic
exp
ress
ion
s
infi
x, p
refi
x, a
nd
po
stfi
x
21
EE
CS
26
8 P
rogra
mm
ing I
I
Th
e A
DT
Bin
ary
Tre
e
+cr
ea
teB
ina
ryTr
ee
()
+cr
ea
teB
ina
ryTr
ee
(in
ro
otI
tem
: Tr
ee
Ite
mTy
pe
)
+cr
ea
teB
ina
ryTr
ee
(in
ro
otI
tem
: Tr
ee
Ite
mTy
pe
,
in
ou
t le
ftTr
ee
: B
ina
ryTr
ee
,
ino
ut
rig
htT
ree
: B
ina
ryTr
ee
)
+d
est
roy
Bin
ary
Tre
e()
+is
Em
pty
():
bo
ole
an
{q
ue
ry}
+g
etR
oo
tDa
ta()
: Tr
ee
Ite
mTy
pe
thro
w T
ree
Exc
ep
tio
n
+se
tRo
otD
ata
(in
ne
wIt
em
: Tr
ee
Ite
mTy
pe
)
th
row
Tre
eE
xce
pti
on
+a
tta
chLe
ft(i
n n
ew
Ite
m:
Tre
eIt
em
Typ
e)
thro
w T
ree
Exc
ep
tio
n
+a
tta
chR
igh
t(in
ne
wIt
em
: Tr
ee
Ite
mTy
pe
)
th
row
Tre
eE
xce
pti
on
+a
tta
chLe
ftS
ub
tre
e(i
no
ut
left
Tre
e:
Bin
ary
Tre
e)
t
hro
w T
ree
Exc
ep
tio
n
+a
tta
chR
igh
tSu
btr
ee
(in
ou
t ri
gh
tTre
e:
Bin
ary
Tre
e)
thro
w T
ree
Exc
ep
tio
n
+d
eta
chLe
ftS
ub
tre
e(o
ut
left
Tre
e:
Bin
ary
Tre
e)
t
hro
w T
ree
Exc
ep
tio
n
+d
eta
chR
igh
tSu
btr
ee
(ou
t ri
gh
tTre
e:
Bin
ary
Tre
e)
t
hro
w T
ree
Exc
ep
tio
n
+g
etL
eft
Su
btr
ee
():
Bin
ary
Tre
e
+g
etR
igh
tSu
btr
ee
():
Bin
ary
Tre
e
+p
reo
rde
rTra
vers
e(i
n v
isit
:Fu
nct
ion
Typ
e)
+in
ord
erT
rave
rse
(in
vis
it:F
un
ctio
nTy
pe
)
+p
ost
ord
erT
rave
rse
(in
vis
it:F
un
ctio
nTy
pe
) E
EC
S 2
68 P
rogra
mm
ing I
I 22
Th
e A
DT
Bin
ary
Tre
e
Bu
ild
ing
th
e A
DT
bin
ary
tre
e i
n F
ig.
10
-6b
tree2.attachLeftSubtree(tree1)
tree3.attachLeftSubtree(tree2)
23
Po
ssib
le R
ep
rese
nta
tio
ns
of
a
Bin
ary
Tre
e
An
arr
ay
-ba
sed
re
pre
sen
tati
on
Use
s a
n a
rra
y o
f tr
ee
no
de
s
Re
qu
ire
s th
e c
rea
tio
n o
f a
fre
e l
ist
tha
t ke
ep
s tr
ack
of
ava
ila
ble
no
de
s
on
ly s
uit
ab
le f
or
com
ple
te b
ina
ry t
ree
s
A p
oin
ter-
ba
sed
re
pre
sen
tati
on
No
de
s h
ave
tw
o p
oin
ters
th
at
lin
k t
he
no
de
s in
th
e
tre
e
24
EE
CS
268 P
rogra
mm
ing I
I
Arr
ay
Ba
sed
Bin
ary
Tre
e
Giv
en
a c
om
ple
te b
ina
ry t
ree
T w
ith
n n
od
es,
T c
an
be
re
pre
sen
ted
usi
ng
an
arr
ay
A[0
:n1
] su
ch t
ha
t ro
ot
of
T i
s in
A[0
]
for
no
de
A[i
], i
ts le
ft c
hil
d is
at
A[2
i+1
] a
nd
its
rig
ht
chil
d a
t A
[2i+
2]
if i
t e
xist
s
Co
mp
lete
ne
ss o
f th
e t
ree
is
imp
ort
an
t b
eca
use
it
min
imiz
es
the
siz
e o
f th
e a
rra
y r
eq
uir
ed
No
te t
ha
t p
are
nt
of
no
de
A[i
] is
at
A[(
i1)/
2]
for
n >
1,
A[i
] is
a le
af
no
de
iff
n <
= 2
i
Ba
lan
ced
re
qu
ire
me
nt
ma
kes
an
arr
ay
re
pre
sen
tati
on
u
nsu
ita
ble
fo
r b
ina
ry s
ea
rch
tre
e im
ple
me
nta
tio
n
EE
CS
26
8 P
rogra
mm
ing I
I 25
Arr
ay
Ba
sed
Bin
ary
Tre
e
Co
mp
lete
tre
e f
its
in m
inim
um
siz
e a
rra
y
spa
ce e
ffic
ien
t
No
de
s d
o n
ot
ne
ed
ch
ild
or
pa
ren
t p
oin
ters
in
de
x o
f th
ese
ca
n b
e c
alc
ula
ted
fro
m t
he
in
de
x o
f th
e
curr
en
t n
od
e
EECS 268 Programming II
26
A
B
C
D
E
F
G
H
I J
A B C D E F G H I J
Arr
ay
Ba
sed
Bin
ary
Tre
e
Ad
van
tag
es
spa
ce s
av
ing
th
rou
gh
dir
ect
co
mp
uta
tio
n o
f ch
ild
an
d
pa
ren
t in
dic
es
rath
er
tha
n p
oin
ters
O(1
) a
cce
ss t
ime
th
rou
gh
dir
ect
co
mp
uta
tio
n
po
inte
rs a
re a
lso
O(1
) a
cce
ss b
ut
wit
h la
rge
r K
Dis
ad
van
tag
es
on
ly u
sefu
l w
he
n t
ree
is
com
ple
te
or,
co
mp
lete
en
ou
gh
th
at
un
use
d c
ell
s d
o n
ot
wa
ste
mu
ch m
em
ory
spa
rse
tre
e r
ep
rese
nta
tio
n i
s to
o m
em
ory
inte
nsi
ve
If a
co
mp
lete
tre
e i
s o
f h
eig
ht
h,
it r
eq
uir
es
an
arr
ay
of
size
2h-1
a
ske
we
d B
ST
of
10
no
de
s is
of
he
igh
t 1
0,
req
uir
ing
an
a
rra
y o
f si
ze 2
10-1
= 1
02
3
EE
CS
26
8 P
rogra
mm
ing I
I 27
Po
inte
r-b
ase
d A
DT
Bin
ary
Tre
e
28
Fig
ure
10
-14
A
po
inte
r-ba
se
d im
ple
me
nta
tio
n o
f a
bin
ary
tre
e
EE
CS
268 P
rogra
mm
ing I
I
Po
inte
r-b
ase
d A
DT
Bin
ary
Tre
e
TreeException
an
d TreeNode
cla
sse
s
BinaryTree
cla
ss
Se
vera
l co
nst
ruct
ors
, in
clu
din
g a
Pro
tect
ed
co
nst
ruct
or
wh
ose
arg
um
en
t is
a p
oin
ter
to a
roo
t n
od
e;
pro
hib
its
clie
nt
acc
ess
Co
py
co
nst
ruct
or
tha
t ca
lls
a p
riva
te f
un
ctio
n t
o c
op
y
ea
ch n
od
e d
uri
ng
a t
rave
rsa
l o
f th
e t
ree
De
stru
cto
r
29
EE
CS
26
8 P
rogra
mm
ing I
I
Bin
ary
Tre
e A
DT
T
ree
No
de
.h
// T
reeN
ode.h
typedef str
ing T
reeItem
Type
;
// n
ode
in the tre
e
cla
ss T
reeN
ode
{
pri
vate
:
T
reeN
ode
() {
};
T
reeN
ode
(const T
reeItem
Type
& n
odeItem
, T
reeN
ode
*le
ft =
NU
LL,
T
reeN
od
e *
rig
ht =
NU
LL
): ite
m(n
od
eIte
m),
le
ftC
hild
Ptr
(left),
rig
htC
hild
Ptr
(rig
ht)
{}
T
reeItem
Type
ite
m; // d
ata
po
rtio
n
T
reeN
ode
*le
ftC
hild
Ptr
; // poin
ter
to left c
hild
T
reeN
ode
*righ
tChild
Ptr
; // p
oin
ter
to r
igh
t ch
ild
fr
iend c
lass B
inary
Tre
e; // fr
ien
d c
lass
};
EE
CS
268 P
rogra
mm
ing I
I 30
Bin
ary
Tre
e A
DT
T
ree
Exc
ep
tio
n.h
// T
ree
Exce
ption.h
#in
clu
de <
std
exce
pt>
#in
clu
de <
str
ing>
usin
g n
am
espace s
td;
Cla
ss T
ree
Exce
ptio
n :
pu
blic
lo
gic
_e
rro
r {
pub
lic:
T
ree
Exce
ption
(co
nst
lo
gic
_err
or(
message
.c_str
())
{}
};
EE
CS
26
8 P
rogra
mm
ing I
I 31
Bin
ary
Tre
e A
DT
B
ina
ryTr
ee
.h
//B
eg
in B
ina
ryT
ree.h
#in
clu
de
"T
reeE
xce
ptio
n.h
"
#in
clu
de "
Tre
eN
ode.h
"
// T
his
fu
nctio
n p
oin
ter
is u
sed
by t
he c
lien
t
// to
cu
sto
miz
e w
hat
hap
pe
ns w
hen
a n
ode
is v
isite
d
typ
ed
ef
vo
id (
*Fu
nctio
nT
yp
e)(
Tre
eIt
em
Typ
e&
anIt
em
);
cla
ss B
ina
ryT
ree {
pub
lic:
// c
onstr
ucto
rs a
nd
destr
ucto
r:
Bin
ary
Tre
e()
;
Bin
ary
Tre
e(c
onst
Tre
eIt
em
Typ
e&
ro
otI
tem
);
Bin
ary
Tre
e(c
onst
Tre
eIt
em
Type&
rootI
tem
, B
inary
Tre
e&
left
Tre
e,
Bin
ary
Tre
e&
rig
htT
ree);
Bin
ary
Tre
e(c
onst
Bin
ary
Tre
e&
tre
e);
virtu
al ~
Bin
ary
Tre
e()
;
E
EC
S 2
68 P
rogra
mm
ing I
I 32
Bin
ary
Tre
e A
DT
B
ina
ryTr
ee
.h
// b
inary
tre
e o
pe
ratio
ns:
virtu
al bool is
Em
pty
() c
onst;
virtu
al T
reeIt
em
Typ
e g
etR
ootD
ata
() c
onst
t
hro
w(T
reeE
xce
ptio
n);
virtu
al void
setR
ootD
ata
(const T
reeIt
em
Type&
new
Item
) th
row
(T
reeE
xception);
virtu
al vo
id a
tta
chL
eft
(co
nst T
reeIt
em
Typ
e&
new
Ite
m)
th
row
(Tre
eE
xce
ptio
n);
virtu
al vo
id a
tta
chR
ight(
co
nst T
reeIt
em
Typ
e&
new
Ite
m)
th
row
(Tre
eE
xce
ptio
n);
virtu
al vo
id a
tta
chL
eft
Sub
tree(B
ina
ryT
ree&
left
Tre
e)
th
row
(Tre
eE
xce
ptio
n);
virtu
al vo
id a
tta
chR
ightS
ubtr
ee(B
ina
ryT
ree&
rig
htT
ree)
t
hro
w(T
reeE
xce
ptio
n);
virtu
al vo
id d
eta
chL
eft
Sub
tree(B
ina
ryT
ree&
left
Tre
e)
th
row
(Tre
eE
xce
ptio
n);
virtu
al vo
id d
eta
chR
ightS
ubtr
ee(B
ina
ryT
ree&
rig
htT
ree)
th
row
(Tre
eE
xce
ptio
n);
virtu
al B
ina
ryT
ree g
etL
eft
Sub
tree()
co
nst;
virtu
al B
inary
Tre
e g
etR
ightS
ubtr
ee()
const;
virtu
al vo
id p
reo
rde
rTra
vers
e(F
unctio
nT
yp
e v
isit);
virtu
al vo
id ino
rde
rTra
vers
e(F
unctio
nT
yp
e v
isit);
virtu
al vo
id p
osto
rde
rTra
vers
e(F
unctio
nT
yp
e v
isit);
E
EC
S 2
68 P
rogra
mm
ing I
I 33
Bin
ary
Tre
e A
DT
B
ina
ryTr
ee
.h
// o
verloa
de
d a
ssig
nm
ent
ope
rato
r:
virtu
al B
ina
ryT
ree&
ope
rato
r=(c
onst
Bin
ary
Tre
e&
rh
s);
pro
tecte
d:
Bin
ary
Tre
e(T
reeN
od
e *
nod
eP
tr);
//
con
str
ucto
r
// C
op
ies t
he t
ree r
oote
d a
t tr
eeP
tr into
a t
ree r
oote
d
// a
t n
ew
Tre
eP
tr.
Th
row
s T
reeE
xce
ptio
n if
a c
opy o
f th
e
// tre
e c
ann
ot
be a
lloca
ted
.
void
copyT
ree(T
reeN
ode *
tre
eP
tr, T
reeN
ode*
& n
ew
Tre
eP
tr)
const
th
row
(Tre
eE
xce
ptio
n);
;
// D
ea
lloca
te m
em
ory
fo
r a
tre
e.
v
oid
destr
oyT
ree(T
reeN
od
e *
&tr
eeP
tr);
// T
he n
ext
two f
unctions r
etr
ieve a
nd s
et
the v
alu
e
// o
f th
e p
rivate
data
me
mbe
r ro
ot.
T
reeN
od
e *
rootP
tr(
) co
nst;
vo
id s
etR
oo
tPtr
(Tre
eN
od
e *
new
Ro
ot)
;
EE
CS
268 P
rogra
mm
ing I
I 34
Bin
ary
Tre
e A
DT
B
ina
ryTr
ee
.h
// T
he n
ext
two
fu
nctio
ns r
etr
ieve
an
d s
et
the v
alu
es
// o
f th
e le
ft a
nd
rig
ht
ch
ild p
oin
ters
of
a t
ree n
od
e.
void
getC
hild
Ptr
s(T
reeN
ode *
nodeP
tr, T
reeN
ode *
&le
ftC
hild
Ptr
,
T
reeN
od
e *
&righ
tChild
Ptr
) co
nst;
vo
id s
etC
hild
Ptr
s(T
reeN
od
e *
nod
eP
tr, T
reeN
od
e *
left
Child
Ptr
,
T
reeN
od
e *
righ
tChild
Ptr
);
vo
id p
reord
er(
Tre
eN
od
e *
tre
eP
tr, F
unctio
nT
yp
e v
isit);
vo
id ino
rde
r(T
reeN
od
e *
tre
eP
tr, F
unctio
nT
yp
e v
isit);
vo
id p
osto
rde
r(T
reeN
od
e *
tre
eP
tr,
Fu
nctio
nT
yp
e v
isit);
priva
te:
T
reeN
od
e *
roo
t; /
/ p
oin
ter
to r
oot
of
tre
e
}; // e
nd
cla
ss
// E
nd
of
hea
de
r file
. B
ina
ryT
ree.h
EE
CS
26
8 P
rogra
mm
ing I
I 35
Bin
ary
Tre
e A
DT
B
ina
ryTr
ee
.cp
p
// Im
ple
me
nta
tion
file
Bin
ary
Tre
e.c
pp f
or
the A
DT
bin
ary
tr
ee.
#in
clu
de
"B
ina
ryT
ree.h
"
//
he
ad
er
file
#in
clu
de
<cstd
de
f>
//
de
finitio
n o
f N
UL
L
#in
clu
de
<ca
ssert
>
//
for
assert
()
Bin
ary
Tre
e::
Bin
ary
Tre
e()
: r
oo
t(N
UL
L)
{ }
Bin
ary
Tre
e::
Bin
ary
Tre
e(c
on
st
Tre
eIt
em
Typ
e&
ro
otI
tem
) {
root
= n
ew
Tre
eN
od
e(r
ootI
tem
, N
UL
L,
NU
LL);
assert
(ro
ot
!= N
ULL);
} Bin
ary
Tre
e::
Bin
ary
Tre
e(c
on
st
Tre
eIt
em
Typ
e&
ro
otI
tem
,
B
ina
ryT
ree&
left
Tre
e,
Bin
ary
Tre
e&
rig
htT
ree)
{
root
= n
ew
Tre
eN
od
e(r
ootI
tem
, N
UL
L,
NU
LL);
assert
(ro
ot
!= N
ULL);
att
achL
eft
Sub
tree
(left
Tre
e);
att
achR
ightS
ubtr
ee(r
igh
tTre
e);
} E
EC
S 2
68 P
rogra
mm
ing I
I 36
Bin
ary
Tre
e A
DT
B
ina
ryTr
ee
.cp
p
Bin
ary
Tre
e::
Bin
ary
Tre
e(c
on
st
Bin
ary
Tre
e&
tre
e)
{
co
pyT
ree(t
ree.r
oot,
ro
ot)
;
} Bin
ary
Tre
e::
Bin
ary
Tre
e(T
reeN
ode *
nodeP
tr):
root(
nodeP
tr)
{ }
Bin
ary
Tre
e::
~B
ina
ryT
ree()
{
destr
oyT
ree(r
oot)
;
}
bool B
ina
ryT
ree::
isE
mpty
() c
onst
{
retu
rn (
root
==
NU
LL);
}
Tre
eIt
em
Typ
e B
ina
ryT
ree::
getR
ootD
ata
() c
onst
{
if (
isE
mpty
())
thro
w T
reeE
xce
ptio
n("
Tre
eE
xce
ptio
n:
Em
pty
tre
e")
;
retu
rn r
oot>
ite
m;
}
EE
CS
26
8 P
rogra
mm
ing I
I 37
Bin
ary
Tre
e A
DT
B
ina
ryTr
ee
.cp
p
vo
id B
ina
ryT
ree::
se
tRoo
tData
(co
nst
Tre
eIt
em
Typ
e&
new
Ite
m)
{
if (
!isE
mpty
())
{
root>
ite
m =
new
Ite
m;
} e
lse
{
root
= n
ew
Tre
eN
ode(n
ew
Item
, N
ULL,
NU
LL);
if (
roo
t =
= N
ULL
)
th
row
Tre
eE
xce
ptio
n("
Tre
eE
xce
ptio
n:
Can
no
t a
lloca
te m
em
ory
");
}
} vo
id B
ina
ryT
ree::
att
achL
eft
(co
nst T
reeIt
em
Typ
e&
new
Ite
m)
{
if (
isE
mpty
())
{
thro
w T
reeE
xce
ptio
n("
Tre
eE
xce
ptio
n:
Em
pty
tre
e")
;
} e
lse
if
(ro
ot>
left
Child
Ptr
!=
NU
LL)
{
thro
w T
reeE
xce
ptio
n("
Tre
eE
xce
ptio
n:
Can
no
t o
verw
rite
left
su
btr
ee")
;
} els
e {
//
Assert
ion:
nonem
pty
tre
e;
no left
ch
ild
root>
left
Child
Ptr
= n
ew
Tre
eN
od
e(n
ew
Ite
m,
NU
LL,
NU
LL);
if (
roo
t>le
ftC
hild
Ptr
==
NU
LL)
th
row
Tre
eE
xce
ptio
n("
Tre
eE
xce
ptio
n:
Can
no
t a
lloca
te m
em
ory
");
}
} E
EC
S 2
68 P
rogra
mm
ing I
I 38
Bin
ary
Tre
e A
DT
B
ina
ryTr
ee
.cp
p
vo
id B
ina
ryT
ree::
att
achR
ight(
co
nst
Tre
eIt
em
Typ
e&
new
Ite
m)
{
if (
isE
mpty
())
thro
w T
reeE
xce
ptio
n("
Tre
eE
xce
ptio
n:
Em
pty
tre
e")
;
els
e if
(ro
ot>
righ
tChild
Ptr
!=
NU
LL)
thro
w T
reeE
xception("
Tre
eE
xception:
Cannot
overw
rite
rig
ht
subtr
ee")
;
els
e {
// A
ssert
ion:
non
em
pty
tre
e;
no r
ight
ch
ild
root>
righ
tChild
Ptr
= n
ew
Tre
eN
od
e(n
ew
Ite
m,
NU
LL,
NU
LL);
if (
roo
t>righ
tChild
Ptr
==
NU
LL)
th
row
Tre
eE
xce
ptio
n("
Tre
eE
xce
ptio
n:
Can
no
t a
lloca
te m
em
ory
");
}
} vo
id B
ina
ryT
ree::
att
achL
eft
Sub
tree(B
ina
ryT
ree&
left
Tre
e)
{
if (
isE
mpty
())
thro
w T
reeE
xce
ptio
n("
Tre
eE
xce
ptio
n:
Em
pty
tre
e")
;
els
e if
(ro
ot>
left
Child
Ptr
!=
NU
LL)
thro
w T
reeE
xception("
Tre
eE
xception:
Cannot
overw
rite
left
subtr
ee")
;
els
e {
//
Assert
ion:
non
em
pty
tre
e;
no le
ft c
hild
root>
left
Child
Ptr
= left
Tre
e.r
oot;
left
Tre
e.r
oot
= N
ULL
;
}
} E
EC
S 2
68 P
rogra
mm
ing I
I 39
Bin
ary
Tre
e A
DT
B
ina
ryTr
ee
.cp
p
vo
id B
ina
ryT
ree::
att
achR
ightS
ubtr
ee(B
ina
ryT
ree&
rig
htT
ree)
{
if (
isE
mpty
())
thro
w T
reeE
xce
ptio
n("
Tre
eE
xce
ptio
n:
Em
pty
tre
e")
;
els
e if
(ro
ot>
rightC
hild
Ptr
!=
NU
LL)
thro
w T
reeE
xce
ptio
n("
Tre
eE
xce
ptio
n:
Can
no
t o
verw
rite
rig
ht
su
btr
ee")
;
els
e {
// A
ssert
ion:
non
em
pty
tre
e;
no
rig
ht
ch
ild
root>
righ
tChild
Ptr
= r
igh
tTre
e.r
oot;
righ
tTre
e.r
oot
= N
UL
L;
}
} vo
id B
ina
ryT
ree::
deta
chL
eft
Sub
tree(B
ina
ryT
ree&
left
Tre
e)
{
if (
isE
mpty
())
thro
w T
reeE
xce
ptio
n("
Tre
eE
xce
ptio
n:
Em
pty
tre
e")
;
els
e {
left
Tre
e =
Bin
ary
Tre
e(r
oot>
left
Child
Ptr
); /
/ co
nstr
ucto
r ta
kin
g n
ode
* n
ot
tre
e *
root>
left
Child
Ptr
= N
ULL
;
}
} E
EC
S 2
68 P
rogra
mm
ing I
I 40
Bin
ary
Tre
e A
DT
B
ina
ryTr
ee
.cp
p
void
Bin
ary
Tre
e::deta
chR
igh
tSubtr
ee
(Bin
ary
Tre
e&
rig
htT
ree
) {
if (
isE
mpty
())
th
row
Tre
eE
xce
ption
("T
reeE
xce
ption
: E
mpty
tre
e")
;
els
e {
righ
tTre
e =
Bin
ary
Tre
e(r
oot>
rightC
hild
Ptr
); // node *
to tre
e
co
nvers
ion
ro
ot>
rightC
hild
Ptr
= N
ULL; // this
tre
e n
o longe
r hold
s that su
btr
ee
}
}
Bin
ary
Tre
e B
inary
Tre
e::getL
eftS
ubtr
ee()
co
nst {
T
reeN
ode
*su
bT
reeP
tr;
if (
isE
mpty
())
re
turn
Bin
ary
Tre
e()
;
els
e {
co
pyT
ree
(root>
leftC
hild
Ptr, su
bT
reeP
tr);
re
turn
Bin
ary
Tre
e(s
ubT
reeP
tr);
}
} E
EC
S 2
68 P
rogra
mm
ing I
I 41
Bin
ary
Tre
e A
DT
B
ina
ryTr
ee
.cp
p
Bin
ary
Tre
e B
ina
ryT
ree::
righ
tSub
tree()
co
nst
{
T
reeN
od
e *
su
bT
reeP
tr;
if (
isE
mpty
())
retu
rn B
inary
Tre
e()
;
els
e {
co
pyT
ree(r
oot>
righ
tChild
Ptr
, su
bT
reeP
tr);
retu
rn B
ina
ryT
ree(s
ubT
reeP
tr);
}
}
vo
id B
ina
ryT
ree::
pre
ord
erT
ravers
e(F
unctio
nT
yp
e v
isit)
{
pre
ord
er(
roo
t, v
isit);
//
pre
ord
er
writt
en w
ith
re
spe
ct
to a
tre
e p
tr
}
void
Bin
ary
Tre
e::
inord
erT
ravers
e(F
unctionT
yp
e v
isit)
{
ino
rde
r(ro
ot,
vis
it);
}
EE
CS
268 P
rogra
mm
ing I
I 42
Bin
ary
Tre
e A
DT
B
ina
ryTr
ee
.cp
p
void
Bin
ary
Tre
e::posto
rderT
ravers
e(F
unctionT
ype
vis
it)
{
posto
rder(
root, v
isit);
} Bin
ary
Tre
e&
Bin
ary
Tre
e::opera
tor=
(const B
inary
Tre
e&
rhs)
{
if (
this
!=
&rh
s)
{
destr
oyT
ree(r
oot)
; // deallo
cate
lefth
an
d s
ide
co
pyT
ree
(rhs.r
oot, r
oot)
; // co
py r
igh
tha
nd
sid
e
}
re
turn
*th
is;
} void
Bin
ary
Tre
e::destr
oyT
ree
(Tre
eN
ode *
& tre
eP
tr)
{
if (
treeP
tr !=
NU
LL)
{
destr
oyT
ree(t
reeP
tr>
leftC
hild
Ptr
);
destr
oyT
ree(t
reeP
tr>
rightC
hild
Ptr
);
dele
te tre
eP
tr; // posto
rder
travers
al
tr
eeP
tr =
NU
LL;
}
} E
EC
S 2
68 P
rogra
mm
ing I
I 43
Bin
ary
Tre
e A
DT
B
ina
ryTr
ee
.cp
p
vo
id B
ina
ryT
ree::
co
pyT
ree(T
reeN
od
e *
tre
eP
tr, T
reeN
od
e *
& n
ew
Tre
eP
tr)
co
nst
{
//
pre
ord
er
tra
vers
al
if (
tre
eP
tr !=
NU
LL)
{
// c
opy n
od
e
new
Tre
eP
tr =
new
Tre
eN
od
e(t
reeP
tr>
ite
m,
NU
LL,
NU
LL);
if (
new
Tre
eP
tr =
= N
UL
L)
th
row
Tre
eE
xce
ptio
n("
Tre
eE
xce
ptio
n:
Can
no
t a
lloca
te m
em
ory
");
co
pyT
ree(t
reeP
tr>
left
Child
Ptr
, n
ew
Tre
eP
tr>
left
Child
Ptr
);
copyT
ree(t
reeP
tr>
rightC
hild
Ptr
, new
Tre
eP
tr>
rightC
hild
Ptr
);
} e
lse
new
Tre
eP
tr =
NU
LL;
//
cop
y e
mpty
tre
e
} Tre
eN
od
e *
Bin
ary
Tre
e::
rootP
tr()
co
nst
{
re
turn
ro
ot;
}
EE
CS
268 P
rogra
mm
ing I
I 44
Bin
ary
Tre
e A
DT
B
ina
ryTr
ee
.cp
p
void
Bin
ary
Tre
e::se
tRootP
tr(T
reeN
ode *
new
Ro
ot)
{
ro
ot =
new
Ro
ot;
} void
Bin
ary
Tre
e::getC
hild
Ptr
s(T
reeN
ode *
node
Ptr
, T
reeN
ode
*&
leftP
tr,
T
reeN
ode
*&
rig
htP
tr)
co
nst {
le
ftP
tr =
node
Ptr
>le
ftC
hild
Ptr
;
righ
tPtr
= n
ode
Ptr
>righ
tChild
Ptr
;
} void
Bin
ary
Tre
e::se
tChild
Ptr
s(T
reeN
ode
*node
Ptr
, T
reeN
ode
*le
ftP
tr,
T
reeN
ode
*righ
tPtr
) {
node
Ptr
>le
ftC
hild
Ptr
= leftP
tr;
nodeP
tr>
rightC
hild
Ptr
= r
ightP
tr;
}
EE
CS
26
8 P
rogra
mm
ing I
I 45
Bin
ary
Tre
e A
DT
B
ina
ryTr
ee
.cp
p
void
Bin
ary
Tre
e::pre
ord
er(
Tre
eN
ode
*tr
ee
Ptr
, F
un
ction
Typ
e v
isit)
{
if (
treeP
tr !=
NU
LL)
{
vis
it(t
reeP
tr>
item
);
pre
ord
er(
treeP
tr>
leftC
hild
Ptr
, vis
it);
pre
ord
er(
treeP
tr>
rig
htC
hild
Ptr
, vis
it);
}
} void
Bin
ary
Tre
e::in
ord
er(
Tre
eN
ode
*tr
eeP
tr, F
unctionType
vis
it)
{
if (
treeP
tr !=
NU
LL)
{
in
ord
er(
treeP
tr>
leftC
hild
Ptr
, vis
it);
vis
it(t
reeP
tr>
item
);
in
ord
er(
treeP
tr>
rig
htC
hild
Ptr
, vis
it);
}
}
EE
CS
268 P
rogra
mm
ing I
I 46
Bin
ary
Tre
e A
DT
B
ina
ryTr
ee
.cp
p
void
Bin
ary
Tre
e::posto
rder(
Tre
eN
ode
*tr
eeP
tr, F
unctionType
vis
it)
{
if (
treeP
tr !=
NU
LL)
{
posto
rder(
treeP
tr>
leftC
hild
Ptr
, vis
it);
posto
rder(
treeP
tr>
rightC
hild
Ptr
, vis
it);
vis
it(t
reeP
tr>
item
);
}
} // E
nd o
f im
ple
menta
tion file
.
EE
CS
26
8 P
rogra
mm
ing I
I 47
Bin
ary
Tre
e A
DT
C
lie
nt
Co
de
// E
xa
mple
clie
nt
co
de
#in
clu
de <
iostr
eam
>
#in
clu
de
"B
ina
ryT
ree.h
"
usin
g n
am
espace s
td;
vo
id d
isp
lay(T
reeIt
em
Typ
e&
anIt
em
);
int
ma
in()
{ B
ina
ryT
ree t
ree1
, tr
ee2
, le
ft;
// tr
ee w
ith
only
a r
oo
t 7
0
B
ina
ryT
ree t
ree3
(70
);
/
/ build
th
e t
ree in F
igure
10
-10
tre
e1
.setR
ootD
ata
(40);
tre
e1
.att
achL
eft
(30);
tre
e1
.att
achR
ight(
50);
E
EC
S 2
68 P
rogra
mm
ing I
I 48
tre
e2
.setR
ootD
ata
(20);
tre
e2
.att
achL
eft
(10);
tre
e2
.att
achR
ightS
ubtr
ee(t
ree
1);
/
/ tr
ee in
Fig
10-1
0
B
ina
ryT
ree b
inT
ree(6
0,
tre
e2
, tr
ee3
);
b
inT
ree.in
ord
erT
ravers
e(d
isp
lay);
b
inT
ree.g
etL
eft
Subtr
ee()
.inord
erT
ravers
e
(dis
pla
y);
b
inT
ree.d
eta
chL
eft
Sub
tree(left
);
left
.in
ord
erT
ravers
e(d
isp
lay);
b
inT
ree.in
ord
erT
ravers
e(d
isp
lay);
r
etu
rn 0
;
} // e
nd
ma
in
Po
inte
r-b
ase
d A
DT
Bin
ary
Tre
e:
Tre
e T
rave
rsa
ls
BinaryTree
cla
ss (
con
tin
ue
d)
Pu
bli
c m
eth
od
s fo
r tr
ave
rsa
ls s
o t
ha
t vis
itin
g a
no
de
re
ma
ins
void inorderTraverse(FunctionType visit);
typedef void (*FunctionType)(TreeItemType&
item);
Pro
tect
ed
me
tho
ds,
su
ch a
s inorder
, th
at
en
ab
le t
he
re
curs
ion
void inorder(TreeNode *treeptr,
FunctionType visit);
inorderTraverse
ca
lls inorder
, p
ass
ing
it
a n
od
e
po
inte
r a
nd
th
e c
lie
nt-
de
fin
ed
fu
nct
ion
visit
49
EE
CS
26
8 P
rogra
mm
ing I
I
Re
curs
ive
In
ord
er
Tra
vers
al
50
EE
CS
268 P
rogra
mm
ing I
I
No
nre
curs
ive
In
ord
er
Tra
vers
al
An
ite
rati
ve m
eth
od
an
d a
n e
xpli
cit
sta
ck
can
mim
ic t
he
act
ion
s
of
a r
etu
rn f
rom
a
recu
rsiv
e c
all
to
inorder
51
Fig
ure
10
-16
Tra
ve
rsin
g (
a)
the
le
ft a
nd
(b
) th
e r
igh
t su
btr
ee
s o
f 2
0
Co
py
ing
a B
ina
ry T
ree
To c
op
y a
tre
e
tra
vers
e i
t in
pre
ord
er
inse
rt e
ach
ite
m v
isit
ed
in
to a
ne
w t
ree
use
in
co
py
co
nst
ruct
or
To d
ea
llo
cate
a t
ree
tr
ave
rse
in
po
sto
rde
r
de
lete
ea
ch n
od
e v
isit
ed
de
all
oca
tio
n
sub
tre
es
use
in
de
stru
cto
r EE
CS
268 P
rogra
mm
ing I
I 52