binary search project
Project 3/p3test1.cpp
Project 3/p3test1.cpp
// File: p3test1.cpp
//
// UMBC CMSC 341 Fall 2017 Project 3
//
// Simple test of insertion
//
#include
<
iostream
>
#include
<
cmath
>
using
namespace
std
;
#include
"ExpBST.h"
void
report
(
const
ExpBST
&
T
)
{
cout
<<
"***** ExpBST Report\n"
;
cout
<<
" size = "
<<
T
.
size
()
<<
endl
;
cout
<<
" height = "
<<
T
.
height
()
<<
endl
;
cout
<<
" height/log(size) = "
<<
(
(
float
)
T
.
height
()
)
/
log2
(
T
.
size
())
<<
endl
;
cout
<<
" numRebalance = "
<<
T
.
getNumRebalance
()
<<
endl
;
cout
<<
" failedRebalance = "
<<
T
.
getFailedRebalance
()
<<
endl
;
cout
<<
" exceedsHeight = "
<<
T
.
getExceedsHeight
()
<<
endl
;
cout
<<
" maxRebalanceDepth = "
<<
T
.
getMaxRebalanceDepth
()
<<
endl
;
cout
<<
" minRebalanceHeight = "
<<
T
.
getMinRebalanceHeight
()
<<
endl
;
cout
<<
" rebalanceFactor = "
<<
T
.
getRebalanceFactor
()
<<
endl
;
}
int
main
()
{
ExpBST
T
(
3
,
3
,
2.0
)
;
int
k
;
T
.
insert
(
70
)
;
T
.
inorder
()
;
cout
<<
endl
;
T
.
insert
(
30
)
;
T
.
inorder
()
;
cout
<<
endl
;
T
.
insert
(
110
)
;
T
.
inorder
()
;
cout
<<
endl
;
cout
<<
"\n\n***** Insert 40 *****\n"
;
T
.
insert
(
40
)
;
T
.
inorder
()
;
cout
<<
endl
;
cout
<<
"\n\n***** Insert 20 *****\n"
;
T
.
insert
(
20
)
;
T
.
inorder
()
;
cout
<<
endl
;
cout
<<
"\n\n***** Insert 41 *****\n"
;
T
.
insert
(
41
)
;
T
.
inorder
()
;
cout
<<
endl
;
cout
<<
"\n\n***** Insert 31 *****\n"
;
T
.
insert
(
31
)
;
T
.
inorder
()
;
cout
<<
endl
;
cout
<<
"\n\n***** Insert 32 *****\n"
;
T
.
insert
(
32
)
;
T
.
inorder
()
;
cout
<<
endl
;
cout
<<
"\n\n***** Insert 33 *****\n"
;
T
.
insert
(
33
)
;
T
.
inorder
()
;
cout
<<
endl
;
cout
<<
"\n\n***** Insert 19 *****\n"
;
T
.
insert
(
19
)
;
T
.
inorder
()
;
cout
<<
endl
;
cout
<<
"\n\n***** Insert 34 *****\n"
;
T
.
insert
(
34
)
;
T
.
inorder
()
;
cout
<<
endl
;
cout
<<
"\n\n***** Insert 35 *****\n"
;
T
.
insert
(
35
)
;
T
.
inorder
()
;
cout
<<
endl
;
cout
<<
"\n\n***** Insert 36 *****\n"
;
T
.
insert
(
36
)
;
T
.
inorder
()
;
cout
<<
endl
;
cout
<<
"\n\n***** Insert 37 *****\n"
;
T
.
insert
(
37
)
;
T
.
inorder
()
;
cout
<<
endl
;
cout
<<
"\n\n***** Insert 38 *****\n"
;
T
.
insert
(
38
)
;
T
.
inorder
()
;
cout
<<
endl
;
cout
<<
"\n\n***** Insert 39 *****\n"
;
T
.
insert
(
39
)
;
T
.
inorder
()
;
cout
<<
endl
;
cout
<<
endl
<<
endl
;
report
(
T
)
;
}
Project 3/p3test2.cpp
Project 3/p3test2.cpp
// File: p3test2.cpp
//
// UMBC CMSC 341 Fall 2017 Project 3
//
// Simple test that also removes nodes.
//
// Should see rebalancing during remove.
//
#include
<
iostream
>
#include
<
cmath
>
using
namespace
std
;
#include
"ExpBST.h"
void
report
(
const
ExpBST
&
T
)
{
cout
<<
"***** ExpBST Report\n"
;
cout
<<
" size = "
<<
T
.
size
()
<<
endl
;
cout
<<
" height = "
<<
T
.
height
()
<<
endl
;
cout
<<
" height/log(size) = "
<<
(
(
float
)
T
.
height
()
)
/
log2
(
T
.
size
())
<<
endl
;
cout
<<
" numRebalance = "
<<
T
.
getNumRebalance
()
<<
endl
;
cout
<<
" failedRebalance = "
<<
T
.
getFailedRebalance
()
<<
endl
;
cout
<<
" exceedsHeight = "
<<
T
.
getExceedsHeight
()
<<
endl
;
cout
<<
" maxRebalanceDepth = "
<<
T
.
getMaxRebalanceDepth
()
<<
endl
;
cout
<<
" minRebalanceHeight = "
<<
T
.
getMinRebalanceHeight
()
<<
endl
;
cout
<<
" rebalanceFactor = "
<<
T
.
getRebalanceFactor
()
<<
endl
;
}
int
main
()
{
ExpBST
T
(
3
,
3
,
2.0
)
;
T
.
insert
(
14
)
;
T
.
insert
(
7
)
;
T
.
insert
(
21
)
;
T
.
insert
(
6
)
;
T
.
insert
(
22
)
;
T
.
insert
(
8
)
;
T
.
insert
(
20
)
;
T
.
insert
(
5
)
;
T
.
insert
(
23
)
;
T
.
insert
(
9
)
;
T
.
insert
(
19
)
;
T
.
insert
(
4
)
;
T
.
insert
(
24
)
;
T
.
insert
(
10
);
T
.
insert
(
18
)
;
T
.
insert
(
3
)
;
T
.
insert
(
25
)
;
T
.
insert
(
11
);
T
.
insert
(
17
)
;
T
.
insert
(
2
)
;
T
.
insert
(
26
)
;
T
.
insert
(
12
);
T
.
insert
(
16
)
;
T
.
insert
(
1
)
;
T
.
insert
(
27
)
;
T
.
insert
(
13
);
T
.
insert
(
15
)
;
T
.
inorder
()
;
cout
<<
endl
<<
endl
;
report
(
T
)
;
cout
<<
endl
;
cout
<<
"removing ..."
<<
endl
;
int
n
;
n
=
27
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
n
=
26
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
n
=
25
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
n
=
24
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
n
=
23
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
n
=
22
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
n
=
21
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
n
=
20
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
n
=
19
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
n
=
18
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
n
=
17
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
n
=
16
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
n
=
15
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
n
=
9
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
cout
<<
endl
;
report
(
T
)
;
return
0
;
}
Project 3/p3test3.cpp
Project 3/p3test3.cpp
// File: p3test3.cpp
//
// UMBC CMSC 341 Fall 2017 Project 3
//
// Simple test of inserting and removing.
// This test includes inserting duplicates and
// attempt to remove keys not in the tree.
//
#include
<
iostream
>
#include
<
cmath
>
using
namespace
std
;
#include
"ExpBST.h"
void
report
(
const
ExpBST
&
T
)
{
cout
<<
"***** ExpBST Report\n"
;
cout
<<
" size = "
<<
T
.
size
()
<<
endl
;
cout
<<
" height = "
<<
T
.
height
()
<<
endl
;
cout
<<
" height/log(size) = "
<<
(
(
float
)
T
.
height
()
)
/
log2
(
T
.
size
())
<<
endl
;
cout
<<
" numRebalance = "
<<
T
.
getNumRebalance
()
<<
endl
;
cout
<<
" failedRebalance = "
<<
T
.
getFailedRebalance
()
<<
endl
;
cout
<<
" exceedsHeight = "
<<
T
.
getExceedsHeight
()
<<
endl
;
cout
<<
" maxRebalanceDepth = "
<<
T
.
getMaxRebalanceDepth
()
<<
endl
;
cout
<<
" minRebalanceHeight = "
<<
T
.
getMinRebalanceHeight
()
<<
endl
;
cout
<<
" rebalanceFactor = "
<<
T
.
getRebalanceFactor
()
<<
endl
;
}
int
main
()
{
ExpBST
T
(
3
,
4
,
2.0
)
;
T
.
insert
(
14
)
;
T
.
insert
(
9
)
;
T
.
insert
(
8
)
;
T
.
insert
(
7
)
;
T
.
insert
(
6
)
;
T
.
insert
(
5
)
;
T
.
insert
(
4
)
;
T
.
insert
(
18
)
;
T
.
insert
(
25
)
;
T
.
insert
(
32
)
;
// Inserting duplicates
T
.
insert
(
3
)
;
T
.
insert
(
32
)
;
T
.
insert
(
9
)
;
T
.
insert
(
18
)
;
T
.
insert
(
1
)
;
T
.
insert
(
44
)
;
T
.
insert
(
12
)
;
T
.
insert
(
15
)
;
T
.
insert
(
4
)
;
T
.
insert
(
29
)
;
T
.
insert
(
10
)
;
T
.
insert
(
21
)
;
T
.
inorder
()
;
cout
<<
endl
;
cout
<<
"removing ..."
<<
endl
;
int
answer
;
// T.dump() ;
int
n
;
n
=
14
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
n
=
12
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
n
=
7
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
n
=
25
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
n
=
3
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
n
=
29
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
n
=
32
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
n
=
15
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
// Removing items that do not exist
cout
<<
endl
;
n
=
19
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
n
=
101
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
n
=
-
32
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
cout
<<
endl
;
n
=
44
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
n
=
21
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
n
=
18
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
n
=
10
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
n
=
9
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
n
=
8
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
n
=
6
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
n
=
5
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
n
=
4
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
n
=
1
;
cout
<<
"removing "
<<
n
<<
endl
;
T
.
remove
(
n
)
;
T
.
inorder
()
;
cout
<<
endl
;
// Final report
cout
<<
endl
;
report
(
T
)
;
return
0
;
}
Project 3/p3test4.cpp
Project 3/p3test4.cpp
// File: p3test4.cpp
//
// UMBC CMSC 341 Fall 2017 Project 3
//
// Checking return values from remove and find.
//
#include
<
iostream
>
#include
<
cmath
>
using
namespace
std
;
#include
"ExpBST.h"
void
report
(
const
ExpBST
&
T
)
{
cout
<<
"***** ExpBST Report\n"
;
cout
<<
" size = "
<<
T
.
size
()
<<
endl
;
cout
<<
" height = "
<<
T
.
height
()
<<
endl
;
cout
<<
" height/log(size) = "
<<
(
(
float
)
T
.
height
()
)
/
log2
(
T
.
size
())
<<
endl
;
cout
<<
" numRebalance = "
<<
T
.
getNumRebalance
()
<<
endl
;
cout
<<
" failedRebalance = "
<<
T
.
getFailedRebalance
()
<<
endl
;
cout
<<
" exceedsHeight = "
<<
T
.
getExceedsHeight
()
<<
endl
;
cout
<<
" maxRebalanceDepth = "
<<
T
.
getMaxRebalanceDepth
()
<<
endl
;
cout
<<
" minRebalanceHeight = "
<<
T
.
getMinRebalanceHeight
()
<<
endl
;
cout
<<
" rebalanceFactor = "
<<
T
.
getRebalanceFactor
()
<<
endl
;
}
int
main
()
{
ExpBST
T
(
3
,
3
,
2.0
)
;
T
.
insert
(
14
)
;
T
.
insert
(
12
)
;
T
.
insert
(
10
)
;
T
.
insert
(
9
)
;
T
.
insert
(
7
)
;
T
.
insert
(
4
)
;
T
.
insert
(
3
)
;
T
.
insert
(
1
)
;
T
.
insert
(
15
)
;
T
.
insert
(
18
)
;
T
.
insert
(
21
)
;
T
.
insert
(
25
)
;
T
.
insert
(
29
)
;
T
.
insert
(
32
)
;
T
.
insert
(
44
)
;
T
.
insert
(
7
)
;
T
.
insert
(
3
)
;
T
.
insert
(
1
)
;
T
.
insert
(
4
)
;
T
.
insert
(
10
)
;
T
.
insert
(
9
)
;
T
.
insert
(
12
)
;
T
.
insert
(
25
)
;
T
.
insert
(
18
)
;
T
.
insert
(
15
)
;
T
.
insert
(
21
)
;
T
.
insert
(
32
)
;
T
.
insert
(
29
)
;
T
.
insert
(
44
)
;
// T.dump() ;
T
.
inorder
()
;
cout
<<
endl
;
int
n
,
answer
;
n
=
3
;
cout
<<
"Find "
<<
n
<<
endl
;
if
(
T
.
find
(
n
)
)
{
cout
<<
"found = "
<<
n
<<
endl
;
}
else
{
cout
<<
"did not find = "
<<
n
<<
endl
;
}
cout
<<
endl
;
n
=
4
;
cout
<<
"Find "
<<
n
<<
endl
;
if
(
T
.
find
(
n
)
)
{
cout
<<
"found = "
<<
n
<<
endl
;
}
else
{
cout
<<
"did not find = "
<<
n
<<
endl
;
}
cout
<<
endl
;
n
=
29
;
cout
<<
"Find "
<<
n
<<
endl
;
if
(
T
.
find
(
n
)
)
{
cout
<<
"found = "
<<
n
<<
endl
;
}
else
{
cout
<<
"did not find = "
<<
n
<<
endl
;
}
cout
<<
endl
;
n
=
39
;
cout
<<
"Find "
<<
n
<<
endl
;
if
(
T
.
find
(
n
)
)
{
cout
<<
"found = "
<<
n
<<
endl
;
}
else
{
cout
<<
"did not find = "
<<
n
<<
endl
;
}
cout
<<
endl
;
n
=
301
;
cout
<<
"Find "
<<
n
<<
endl
;
if
(
T
.
find
(
n
)
)
{
cout
<<
"found = "
<<
n
<<
endl
;
}
else
{
cout
<<
"did not find = "
<<
n
<<
endl
;
}
cout
<<
endl
;
// Checking remove...
n
=
21
;
cout
<<
"Remove "
<<
n
<<
endl
;
if
(
T
.
remove
(
n
)
)
{
cout
<<
n
<<
" removed\n"
;
}
else
{
cout
<<
n
<<
" not found\n"
;
}
T
.
inorder
()
;
cout
<<
endl
;
n
=
18
;
cout
<<
"Remove "
<<
n
<<
endl
;
if
(
T
.
remove
(
n
)
)
{
cout
<<
n
<<
" removed\n"
;
}
else
{
cout
<<
n
<<
" not found\n"
;
}
T
.
inorder
()
;
cout
<<
endl
;
n
=
7
;
cout
<<
"Remove "
<<
n
<<
endl
;
if
(
T
.
remove
(
n
)
)
{
cout
<<
n
<<
" removed\n"
;
}
else
{
cout
<<
n
<<
" not found\n"
;
}
T
.
inorder
()
;
cout
<<
endl
;
n
=
13
;
cout
<<
"Remove "
<<
n
<<
endl
;
if
(
T
.
remove
(
n
)
)
{
cout
<<
n
<<
" removed\n"
;
}
else
{
cout
<<
n
<<
" not found\n"
;
}
T
.
inorder
()
;
cout
<<
endl
;
n
=
29
;
cout
<<
"Remove "
<<
n
<<
endl
;
if
(
T
.
remove
(
n
)
)
{
cout
<<
n
<<
" removed\n"
;
}
else
{
cout
<<
n
<<
" not found\n"
;
}
T
.
inorder
()
;
cout
<<
endl
;
n
=
32
;
cout
<<
"Remove "
<<
n
<<
endl
;
if
(
T
.
remove
(
n
)
)
{
cout
<<
n
<<
" removed\n"
;
}
else
{
cout
<<
n
<<
" not found\n"
;
}
T
.
inorder
()
;
cout
<<
endl
;
n
=
14
;
cout
<<
"Remove "
<<
n
<<
endl
;
if
(
T
.
remove
(
n
)
)
{
cout
<<
n
<<
" removed\n"
;
}
else
{
cout
<<
n
<<
" not found\n"
;
}
T
.
inorder
()
;
cout
<<
endl
;
}
Project 3/p3test5.cpp
Project 3/p3test5.cpp
// File: p3test5.cpp
//
// UMBC CMSC 341 Fall 2017 Project 3
//
// Tests copy constructor, destructor and assignment operator
//
// Should test this with valgrind
//
#include
<
iostream
>
using
namespace
std
;
#include
"ExpBST.h"
int
main
()
{
ExpBST
T1
(
3
,
3
,
2.0
)
;
T1
.
insert
(
14
)
;
T1
.
insert
(
9
)
;
T1
.
insert
(
8
)
;
T1
.
insert
(
7
)
;
T1
.
insert
(
6
)
;
T1
.
insert
(
5
)
;
T1
.
insert
(
4
)
;
T1
.
insert
(
18
)
;
T1
.
insert
(
25
)
;
T1
.
insert
(
32
)
;
cout
<<
"Original T1: "
;
T1
.
inorder
()
;
cout
<<
endl
;
// Use copy constructor
ExpBST
*
Tptr
=
new
ExpBST
(
T1
)
;
cout
<<
"Copied T1: "
;
Tptr
->
inorder
()
;
cout
<<
endl
;
ExpBST
T2
(
3
,
3
,
2.0
)
;
T2
.
insert
(
50
)
;
T2
.
insert
(
25
)
;
T2
.
insert
(
75
)
;
// T2.inorder() ; cout << endl ;
T2
=
*
Tptr
;
cout
<<
"Second copy: "
;
T2
.
inorder
()
;
cout
<<
endl
;
cout
<<
"Delete first copy...\n"
;
delete
Tptr
;
cout
<<
"Recheck original: "
;
T1
.
inorder
()
;
cout
<<
endl
;
cout
<<
"Recheck second copy: "
;
T2
.
inorder
()
;
cout
<<
endl
;
return
0
;
}
Project 3/p3test6.cpp
Project 3/p3test6.cpp
// File: p3test6.cpp
//
// UMBC CMSC 341 Fall 2017 Project 3
//
// Simple test of locate() function
//
#include
<
iostream
>
#include
<
cmath
>
using
namespace
std
;
#include
"ExpBST.h"
void
report
(
const
ExpBST
&
T
)
{
cout
<<
"***** ExpBST Report\n"
;
cout
<<
" size = "
<<
T
.
size
()
<<
endl
;
cout
<<
" height = "
<<
T
.
height
()
<<
endl
;
cout
<<
" height/log(size) = "
<<
(
(
float
)
T
.
height
()
)
/
log2
(
T
.
size
())
<<
endl
;
cout
<<
" numRebalance = "
<<
T
.
getNumRebalance
()
<<
endl
;
cout
<<
" failedRebalance = "
<<
T
.
getFailedRebalance
()
<<
endl
;
cout
<<
" exceedsHeight = "
<<
T
.
getExceedsHeight
()
<<
endl
;
cout
<<
" maxRebalanceDepth = "
<<
T
.
getMaxRebalanceDepth
()
<<
endl
;
cout
<<
" minRebalanceHeight = "
<<
T
.
getMinRebalanceHeight
()
<<
endl
;
cout
<<
" rebalanceFactor = "
<<
T
.
getRebalanceFactor
()
<<
endl
;
}
int
main
()
{
ExpBST
T
(
3
,
3
,
2.0
)
;
T
.
insert
(
140
)
;
T
.
insert
(
90
)
;
T
.
insert
(
80
)
;
T
.
insert
(
70
)
;
T
.
insert
(
60
)
;
T
.
insert
(
50
)
;
T
.
insert
(
40
)
;
T
.
insert
(
180
)
;
T
.
insert
(
250
)
;
T
.
insert
(
320
)
;
T
.
insert
(
85
)
;
T
.
insert
(
65
)
;
T
.
insert
(
55
)
;
T
.
insert
(
120
)
;
T
.
insert
(
115
)
;
T
.
insert
(
125
)
;
T
.
inorder
()
;
cout
<<
endl
;
int
key
=
9999
;
bool
ans
;
const
char
*
str
;
ans
=
T
.
locate
(
str
=
""
,
key
=-
1
)
;
cout
<<
str
<<
": "
<<
ans
<<
" "
<<
key
<<
endl
;
ans
=
T
.
locate
(
str
=
"LL"
,
key
=-
1
)
;
cout
<<
str
<<
": "
<<
ans
<<
" "
<<
key
<<
endl
;
ans
=
T
.
locate
(
str
=
"LLR"
,
key
=-
1
)
;
cout
<<
str
<<
": "
<<
ans
<<
" "
<<
key
<<
endl
;
ans
=
T
.
locate
(
str
=
"RRLR"
,
key
=-
1
)
;
cout
<<
str
<<
": "
<<
ans
<<
" "
<<
key
<<
endl
;
}
Project 3/p3test7.cpp
Project 3/p3test7.cpp
// File: p3test7.cpp
//
// UMBC CMSC 341 Fall 2017 Project 3
//
// Big test with recursive sanityCheck() and lots of data.
//
#include
<
iostream
>
#include
<
stdexcept
>
#include
<
cmath
>
#include
<
set
>
using
namespace
std
;
#include
"ExpBST.h"
const
int
depthLimit
=
50
;
// This function recursively checks if a ExpBST is correct, by checking:
//
// 1. keys are in order
// 2. left subtree is not more than twice the size of right subtree
// or vice versa
//
// This function relies on locate() member function working correctly.
//
// Parameters:
// ExpBST& T = tree to be checked, passed by reference
// char pos[] = must be pre-allocated with depthLimit chars
// int& key = stores key in node indicated by pos, if it exists
// int& height = stores height of node indicated by pos, if it exists
// int& size = stores size of node indicated by pos, if it exists
// bool report = give report for current node? defaults to true.
//
// Return value:
// true if T has a node at pos
// false if T does not have a node at pos
//
// Notes:
// - if return value is false, parameters key, height and size are
// not changed.
// - The pos string/array essentially acts as a stack for exploration
// of the ExpBST. It remembers where we've been and is used to
// determine where we have to check next.
//
bool
sanityCheck
(
ExpBST
&
T
,
char
pos
[],
int
depth
,
data_t
&
key
,
int
&
height
,
int
&
size
,
bool
report
=
true
)
{
int
leftKey
,
rightKey
;
int
leftHeight
=-
1
,
rightHeight
=-
1
;
int
leftSize
=
0
,
rightSize
=
0
;
bool
hasLeft
,
hasRight
;
// Try to catch bad BST with cycles
//
if
(
depth
>=
depthLimit
)
{
throw
out_of_range
(
"Depth limit reached. Something looks wrong!\n"
)
;
}
// Is does current position have a node?
//
if
(
!
T
.
locate
(
pos
,
key
)
)
return
false
;
// Add extra '\0' so pos string can be extended
//
pos
[
depth
+
1
]
=
'\0'
;
// Recursively checks left subtree.
//
pos
[
depth
]
=
'L'
;
hasLeft
=
sanityCheck
(
T
,
pos
,
depth
+
1
,
leftKey
,
leftHeight
,
leftSize
,
report
)
;
// Recursively checks right subtree.
//
pos
[
depth
]
=
'R'
;
hasRight
=
sanityCheck
(
T
,
pos
,
depth
+
1
,
rightKey
,
rightHeight
,
rightSize
,
report
)
;
pos
[
depth
]
=
'\0'
;
// restores pos[]
// Compute current node's height and size
//
height
=
1
+
(
(
leftHeight
>
rightHeight
)
?
leftHeight
:
rightHeight
)
;
size
=
1
+
leftSize
+
rightSize
;
// Check key ordering for left child
//
if
(
hasLeft
&&
leftKey
>=
key
)
{
cerr
<<
"\nIn position "
<<
pos
<<
" (key="
<<
key
<<
",height="
<<
height
<<
",size="
<<
size
<<
")"
<<
" left child's key not less than current node's key:"
<<
leftKey
<<
" "
<<
key
<<
endl
;
}
// Check key ordering for right child
//
if
(
hasRight
&&
rightKey
<=
key
)
{
cerr
<<
"\nIn position "
<<
pos
<<
" (key="
<<
key
<<
",height="
<<
height
<<
",size="
<<
size
<<
")"
<<
" right child's key not greater than current node's key:"
<<
rightKey
<<
" "
<<
key
<<
endl
;
}
// Check height <= RebalanceFactor * log2(size)
//
float
factor
=
T
.
getRebalanceFactor
()
;
if
(
height
>
T
.
getMinRebalanceHeight
()
)
{
if
(
height
>
factor
*
log2
(
size
)
)
{
cerr
<<
"\nIn position "
<<
pos
<<
" (key="
<<
key
<<
",height="
<<
height
<<
",size="
<<
size
<<
")"
<<
" tree too tall, "
<<
factor
<<
"* log(size) = "
<<
factor
*
log2
(
size
)
<<
endl
;
}
}
// Give stats for current node, if so desired.
//
if
(
report
)
{
cout
<<
"\nNode report on position "
<<
pos
<<
" :"
<<
endl
;
cout
<<
" key = "
<<
key
<<
" height = "
<<
height
<<
" size = "
<<
size
<<
endl
;
if
(
hasLeft
)
{
cout
<<
" left child key = "
<<
leftKey
<<
endl
;
}
else
{
cout
<<
" no left child\n"
;
}
if
(
hasRight
)
{
cout
<<
" right child key = "
<<
rightKey
<<
endl
;
}
else
{
cout
<<
" no right child\n"
;
}
}
return
true
;
}
bool
checkAgainstSTLSet
(
ExpBST
&
T
,
set
<
data_t
>&
S
)
{
if
(
T
.
size
()
!=
S
.
size
()
)
{
cout
<<
"\nError: sizes mismatched:\n"
;
cout
<<
" T.size() = "
<<
T
.
size
()
<<
endl
;
cout
<<
" S.size() = "
<<
S
.
size
()
<<
endl
;
return
false
;
}
set
<
data_t
>::
iterator it
;
const
data_t
*
ptr
;
for
(
it
=
S
.
begin
()
;
it
!=
S
.
end
()
;
it
++
)
{
ptr
=
T
.
find
(
*
it
)
;
if
(
ptr
==
NULL
)
{
cout
<<
"\nError: "
<<
*
it
<<
" in S but not in T.\n"
;
return
false
;
}
}
return
true
;
}
void
report
(
const
ExpBST
&
T
)
{
cout
<<
"***** ExpBST Report\n"
;
cout
<<
" size = "
<<
T
.
size
()
<<
endl
;
cout
<<
" height = "
<<
T
.
height
()
<<
endl
;
cout
<<
" height/log(size) = "
<<
(
(
float
)
T
.
height
()
)
/
log2
(
T
.
size
())
<<
endl
;
cout
<<
" numRebalance = "
<<
T
.
getNumRebalance
()
<<
endl
;
cout
<<
" failedRebalance = "
<<
T
.
getFailedRebalance
()
<<
endl
;
cout
<<
" exceedsHeight = "
<<
T
.
getExceedsHeight
()
<<
endl
;
cout
<<
" maxRebalanceDepth = "
<<
T
.
getMaxRebalanceDepth
()
<<
endl
;
cout
<<
" minRebalanceHeight = "
<<
T
.
getMinRebalanceHeight
()
<<
endl
;
cout
<<
" rebalanceFactor = "
<<
T
.
getRebalanceFactor
()
<<
endl
;
// printf(" rebalanceFactor = %f\n", rebalanceFactor) ;
}
int
main
()
{
ExpBST
T
(
3
,
5
,
1.5
)
;
set
<
data_t
>
S
;
// add a bunch of numbers
//
T
.
insert
(
70
)
;
T
.
insert
(
30
)
;
T
.
insert
(
110
)
;
T
.
insert
(
40
)
;
T
.
insert
(
20
)
;
T
.
insert
(
41
)
;
T
.
insert
(
31
)
;
T
.
insert
(
32
)
;
T
.
insert
(
33
)
;
T
.
insert
(
19
)
;
T
.
insert
(
34
)
;
T
.
insert
(
15
)
;
T
.
insert
(
14
)
;
T
.
insert
(
38
)
;
T
.
insert
(
81
)
;
T
.
insert
(
95
)
;
T
.
insert
(
43
)
;
T
.
insert
(
17
)
;
S
.
insert
(
70
)
;
S
.
insert
(
30
)
;
S
.
insert
(
110
)
;
S
.
insert
(
40
)
;
S
.
insert
(
20
)
;
S
.
insert
(
41
)
;
S
.
insert
(
31
)
;
S
.
insert
(
32
)
;
S
.
insert
(
33
)
;
S
.
insert
(
19
)
;
S
.
insert
(
34
)
;
S
.
insert
(
15
)
;
S
.
insert
(
14
)
;
S
.
insert
(
38
)
;
S
.
insert
(
81
)
;
S
.
insert
(
95
)
;
S
.
insert
(
43
)
;
S
.
insert
(
17
)
;
T
.
inorder
()
;
cout
<<
endl
;
char
pos
[
depthLimit
]
;
pos
[
0
]
=
'\0'
;
int
key
,
height
,
size
;
// Do check
//
cout
<<
"First a small test...\n"
;
sanityCheck
(
T
,
pos
,
0
,
key
,
height
,
size
)
;
cout
<<
"\n\nSmall tree has root with key="
<<
key
<<
", height="
<<
height
<<
", size="
<<
size
<<
endl
;
if
(
checkAgainstSTLSet
(
T
,
S
)
)
{
cout
<<
"Passed check against STL set S\n"
;
}
else
{
cout
<<
"*** Failed check against STL set S\n"
;
}
report
(
T
)
;
cout
<<
endl
<<
endl
;
cout
<<
"Now a big test...\n"
;
ExpBST
::
resetStats
()
;
ExpBST
T2
(
3
,
5
,
2.0
)
;
set
<
data_t
>
S2
;
for
(
int
i
=
1000
;
i
<
1500
;
i
++
)
{
T2
.
insert
(
i
)
;
S2
.
insert
(
i
)
;
}
for
(
int
i
=
1200
;
i
<
1300
;
i
++
)
{
T2
.
remove
(
i
)
;
S2
.
erase
(
i
)
;
}
for
(
int
i
=
250
;
i
<
900
;
i
++
)
{
T2
.
insert
(
i
)
;
S2
.
insert
(
i
)
;
}
for
(
int
i
=
450
;
i
<
650
;
i
++
)
{
T2
.
remove
(
i
)
;
S2
.
erase
(
i
)
;
}
for
(
int
i
=
3000
;
i
>
1600
;
i
--
)
{
T2
.
insert
(
i
)
;
S2
.
insert
(
i
)
;
}
for
(
int
i
=
2700
;
i
>
2300
;
i
--
)
{
T2
.
remove
(
i
)
;
S2
.
erase
(
i
)
;
}
for
(
int
i
=
3500
;
i
<
6000
;
i
++
)
{
T2
.
insert
(
i
)
;
S2
.
insert
(
i
)
;
}
for
(
int
i
=
4200
;
i
<
4750
;
i
++
)
{
T2
.
remove
(
i
)
;
S2
.
erase
(
i
)
;
}
sanityCheck
(
T2
,
pos
,
0
,
key
,
height
,
size
,
false
)
;
cout
<<
"\n\nBig tree has root with key="
<<
key
<<
", height="
<<
height
<<
", size="
<<
size
<<
endl
;
if
(
checkAgainstSTLSet
(
T2
,
S2
)
)
{