testSPLAVL.cpp 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173
  1. /*testSplavl.cpp
  2. *Dylan Jeffers
  3. *Tahmid Rahman
  4. *
  5. *Test script for SPLAVL Trees
  6. *are at the bottom of the script
  7. *
  8. *The nature and structure of this
  9. *code was inspired by our test code
  10. *for AVL trees from CS31, a class
  11. *taken Fall, 2014 at Swarthmore
  12. */
  13. #include <stdlib.h> // Used for pseudo-random number generation.
  14. #include <assert.h> // Used for testing below.
  15. #include <iostream>
  16. #include "pair.h"
  17. #include "BST.h"
  18. #include "library/circularArrayList.h"
  19. #include "library/queue.h"
  20. #include "AVLTree.h"
  21. #include "SPLAVL.h"
  22. #include "SPLAVL.h"
  23. using namespace std;
  24. void insertTest();
  25. void updateTest();
  26. void findTest();
  27. void testMaxMin();
  28. void testgetHeight();
  29. void SPLAYRemoveTest();
  30. void AVLRemoveTest();
  31. void AVLInsertTest();
  32. void SPLAVLinsertTest();
  33. int main() {
  34. insertTest();
  35. SPLAVLinsertTest();
  36. findTest();
  37. updateTest();
  38. SPLAYRemoveTest();
  39. AVLRemoveTest();
  40. AVLInsertTest();
  41. cout << "Passed SPLAVL tests!" << endl;
  42. return 0;
  43. }
  44. /* insertTest - accomplishes the following
  45. * *tests getSize
  46. *
  47. * *ensures a new tree is indeed empty
  48. *
  49. * *ensures each insert increases the size by 1
  50. *
  51. * *tests that each inserted element is in the tree
  52. * *tests inserting lots of elements in increasing order,
  53. * then lots of elements in decreasing order
  54. *
  55. * *tests that each inserted element is splayed to the right spot
  56. * by checking all four traversal algorithms on five small subtrees
  57. *
  58. */
  59. void insertTest() {
  60. SPLAVL<int,int> BST;
  61. BST.setMaxCount(1000);
  62. //Queue< Pair<int,int> >* queue0;
  63. SPLAVL<int, char> SBST1, SBST2, SBST3, SBST4, SBST5;
  64. SBST1.setMaxCount(1000);
  65. SBST2.setMaxCount(1000);
  66. SBST3.setMaxCount(1000);
  67. SBST4.setMaxCount(1000);
  68. SBST5.setMaxCount(1000);
  69. Queue< Pair<int,char> >* queue1;
  70. Queue< Pair<int,char> >* queue2;
  71. Queue< Pair<int,char> >* queue3;
  72. Queue< Pair<int,char> >* queue4;
  73. assert(BST.getSize() == 0); // Checks that initial size is correct. assert
  74. // causes the program to immediately crash if
  75. // the condition is false.
  76. for (int i = 0; i < 100; ++i) {
  77. BST.insert(2*i + 1, i);
  78. assert(BST.getSize() == i+1);
  79. assert(BST.getRootKey() == 2*i+1);
  80. }
  81. for (int i = 0; i < 100; ++i) { // Checks that keys are in the tree.
  82. assert(BST.contains(2*i + 1));
  83. assert(BST.getRootKey() == 2*i+1);
  84. }
  85. for (int i = 0; i < 100; ++i) {
  86. BST.insert(-2*i - 1, i);
  87. assert(BST.getSize() == i+1 + 100);
  88. }
  89. for (int i = 0; i < 100; ++i) { // Checks that keys are in the tree.
  90. assert(BST.contains(-2*i - 1));
  91. }
  92. for (int i = 0; i < 100; ++i) { //Error returned if key already exists.
  93. try{
  94. BST.insert(2*i + 1, i);
  95. assert(false);
  96. } catch(runtime_error& exc){}
  97. }
  98. //===============================================
  99. /* The following tests each tree traversal algorithm on
  100. * five elementary subtrees.
  101. */
  102. SBST1.insert(1, 'A');
  103. SBST1.insert(2, 'B');
  104. SBST1.insert(3, 'C');
  105. queue1 = SBST1.getPostOrder();
  106. queue2 = SBST1.getPreOrder();
  107. queue3 = SBST1.getInOrder();
  108. queue4 = SBST1.getLevelOrder();
  109. assert(queue1->dequeue().second == 'A');
  110. assert(queue1->dequeue().second == 'B');
  111. assert(queue1->dequeue().second == 'C');
  112. assert(queue2->dequeue().second == 'C');
  113. assert(queue2->dequeue().second == 'B');
  114. assert(queue2->dequeue().second == 'A');
  115. assert(queue3->dequeue().second == 'A');
  116. assert(queue3->dequeue().second == 'B');
  117. assert(queue3->dequeue().second == 'C');
  118. assert(queue4->dequeue().second == 'C');
  119. assert(queue4->dequeue().second == 'B');
  120. assert(queue4->dequeue().second == 'A');
  121. delete queue1;
  122. delete queue2;
  123. delete queue3;
  124. delete queue4;
  125. //===============================================
  126. SBST2.insert(3, 'C');
  127. SBST2.insert(2, 'B');
  128. SBST2.insert(1, 'A');
  129. queue1 = SBST2.getPostOrder();
  130. queue2 = SBST2.getPreOrder();
  131. queue3 = SBST2.getInOrder();
  132. queue4 = SBST2.getLevelOrder();
  133. assert(queue1->dequeue().second == 'C');
  134. assert(queue1->dequeue().second == 'B');
  135. assert(queue1->dequeue().second == 'A');
  136. assert(queue2->dequeue().second == 'A');
  137. assert(queue2->dequeue().second == 'B');
  138. assert(queue2->dequeue().second == 'C');
  139. assert(queue3->dequeue().second == 'A');
  140. assert(queue3->dequeue().second == 'B');
  141. assert(queue3->dequeue().second == 'C');
  142. assert(queue4->dequeue().second == 'A');
  143. assert(queue4->dequeue().second == 'B');
  144. assert(queue4->dequeue().second == 'C');
  145. delete queue1;
  146. delete queue2;
  147. delete queue3;
  148. delete queue4;
  149. //===============================================
  150. SBST3.insert(2, 'B');
  151. SBST3.insert(1, 'A');
  152. SBST3.insert(3, 'C');
  153. queue1 = SBST3.getPostOrder();
  154. queue2 = SBST3.getPreOrder();
  155. queue3 = SBST3.getInOrder();
  156. queue4 = SBST3.getLevelOrder();
  157. assert(queue1->dequeue().second == 'B');
  158. assert(queue1->dequeue().second == 'A');
  159. assert(queue1->dequeue().second == 'C');
  160. assert(queue2->dequeue().second == 'C');
  161. assert(queue2->dequeue().second == 'A');
  162. assert(queue2->dequeue().second == 'B');
  163. assert(queue3->dequeue().second == 'A');
  164. assert(queue3->dequeue().second == 'B');
  165. assert(queue3->dequeue().second == 'C');
  166. assert(queue4->dequeue().second == 'C');
  167. assert(queue4->dequeue().second == 'A');
  168. assert(queue4->dequeue().second == 'B');
  169. delete queue1;
  170. delete queue2;
  171. delete queue3;
  172. delete queue4;
  173. //===============================================
  174. SBST4.insert(3, 'C');
  175. SBST4.insert(1, 'A');
  176. SBST4.insert(2, 'B');
  177. queue1 = SBST4.getPostOrder();
  178. queue2 = SBST4.getPreOrder();
  179. queue3 = SBST4.getInOrder();
  180. queue4 = SBST4.getLevelOrder();
  181. assert(queue1->dequeue().second == 'A');
  182. assert(queue1->dequeue().second == 'C');
  183. assert(queue1->dequeue().second == 'B');
  184. assert(queue2->dequeue().second == 'B');
  185. assert(queue2->dequeue().second == 'A');
  186. assert(queue2->dequeue().second == 'C');
  187. assert(queue3->dequeue().second == 'A');
  188. assert(queue3->dequeue().second == 'B');
  189. assert(queue3->dequeue().second == 'C');
  190. assert(queue4->dequeue().second == 'B');
  191. assert(queue4->dequeue().second == 'A');
  192. assert(queue4->dequeue().second == 'C');
  193. delete queue1;
  194. delete queue2;
  195. delete queue3;
  196. delete queue4;
  197. //===============================================
  198. SBST5.insert(1, 'A');
  199. SBST5.insert(3, 'C');
  200. SBST5.insert(2, 'B');
  201. queue1 = SBST5.getPostOrder();
  202. queue2 = SBST5.getPreOrder();
  203. queue3 = SBST5.getInOrder();
  204. queue4 = SBST5.getLevelOrder();
  205. assert(queue1->dequeue().second == 'A');
  206. assert(queue1->dequeue().second == 'C');
  207. assert(queue1->dequeue().second == 'B');
  208. assert(queue2->dequeue().second == 'B');
  209. assert(queue2->dequeue().second == 'A');
  210. assert(queue2->dequeue().second == 'C');
  211. assert(queue3->dequeue().second == 'A');
  212. assert(queue3->dequeue().second == 'B');
  213. assert(queue3->dequeue().second == 'C');
  214. assert(queue4->dequeue().second == 'B');
  215. assert(queue4->dequeue().second == 'A');
  216. assert(queue4->dequeue().second == 'C');
  217. delete queue1;
  218. delete queue2;
  219. delete queue3;
  220. delete queue4;
  221. }
  222. /* findTest - accomplishes the following
  223. *
  224. * *tests that each removed element
  225. * is not in the tree
  226. *
  227. * *tests that right value is returned when find is called
  228. *
  229. * *tests that the element found is splayed to root
  230. */
  231. void findTest() {
  232. SPLAVL<int,int> BST;
  233. SPLAVL<int, char> BST2;
  234. BST.setMaxCount(1000);
  235. BST2.setMaxCount(1000);
  236. assert(BST.getSize() == 0); // Checks that initial size is correct.
  237. for (int i = 0; i < 100; ++i) {
  238. BST.insert(2*i + 1, i);
  239. assert(BST.getSize() == i+1);
  240. }
  241. for (int i = 0; i < 100; ++i) { // Checks that keys are in the tree.
  242. assert(BST.find(2*i + 1) == i);
  243. assert(BST.getRootKey() == 2*i+1);
  244. }
  245. for (int i = 0; i < 100; ++i) { // Checks that key returns proper update.
  246. BST.update(2*i + 1, 2*i);
  247. assert(BST.find(2*i + 1) == 2*i);
  248. assert(BST.getRootKey() == 2*i+1);
  249. }
  250. try{ // Testing edge cases
  251. BST.find(0);
  252. assert(BST.getRootKey() == 199);
  253. assert(false);
  254. } catch(runtime_error& exc){}
  255. try{
  256. BST.find(2*99 + 2);
  257. assert(false);
  258. } catch(runtime_error& exc){}
  259. BST2.insert(4, 'D');
  260. assert(BST2.getRootKey() == 4);
  261. BST2.insert(3, 'C');
  262. assert(BST2.getRootKey() == 3);
  263. BST2.insert(5, 'E');
  264. assert(BST2.getRootKey() == 5);
  265. BST2.insert(1, 'A');
  266. assert(BST2.getRootKey() == 1);
  267. BST2.insert(2, 'B');
  268. assert(BST2.getRootKey() == 2);
  269. assert(BST2.find(4) == 'D');
  270. assert(BST2.getRootKey() == 4);
  271. BST2.remove(4);
  272. try{
  273. BST2.find(4);
  274. assert(false);
  275. } catch(runtime_error& exc){}
  276. assert(BST2.find(2) == 'B');
  277. assert(BST2.getRootKey() == 2);
  278. BST2.remove(2);
  279. try{
  280. BST2.find(2);
  281. assert(false);
  282. } catch(runtime_error& exc){}
  283. assert(BST2.find(1) == 'A');
  284. assert(BST2.getRootKey() == 1);
  285. BST2.remove(1);
  286. try{
  287. BST2.find(1);
  288. assert(false);
  289. } catch(runtime_error& exc){}
  290. assert(BST2.find(3) == 'C');
  291. assert(BST2.getRootKey() == 3);
  292. BST2.remove(3);
  293. try{
  294. BST2.find(3);
  295. assert(false);
  296. } catch(runtime_error& exc){}
  297. assert(BST2.find(5) == 'E');
  298. assert(BST2.getRootKey() == 5);
  299. BST2.remove(5);
  300. try{
  301. BST2.find(5);
  302. assert(false);
  303. } catch(runtime_error& exc){}
  304. }
  305. /* updateTest - accomplishes the following
  306. * *tests that update returns error if key is
  307. * not in tree
  308. *
  309. * *tests that each updated element is in the right spot
  310. * by checking on five elementary subtrees (i.e. with 3 nodes)
  311. *
  312. * *checks that updated element is splayed to root
  313. */
  314. void updateTest(){
  315. SPLAVL<int, char> SBST1, SBST2, SBST3, SBST4, SBST5;
  316. Queue< Pair<int,char> >* queue;
  317. SPLAVL<int, int> BST;
  318. SBST1.setMaxCount(1000);
  319. SBST2.setMaxCount(1000);
  320. SBST3.setMaxCount(1000);
  321. SBST4.setMaxCount(1000);
  322. SBST5.setMaxCount(1000);
  323. BST.setMaxCount(1000);
  324. assert(BST.getSize() == 0); // Checks that initial size is correct.
  325. try{ // errors returned when key does not exist in subtree
  326. BST.update(5, 10);
  327. assert(false);
  328. } catch(runtime_error& exc){}
  329. for (int i = 0; i < 100; ++i) { //inserts and updates 100 elements
  330. BST.insert(2*i + 1, i);
  331. assert(BST.contains(2*i + 1));
  332. BST.update(2*i + 1, 2*i);
  333. assert(BST.getSize() == i+1);
  334. }
  335. try{
  336. BST.update(2*99 + 2, 100);
  337. assert(false);
  338. } catch(runtime_error& exc){}
  339. for (int i = 0; i < 100; ++i) { // Checks that keys haven't been changed
  340. assert(BST.contains(2*i + 1));
  341. }
  342. SBST1.insert(1, 'A');
  343. SBST1.insert(2, 'B');
  344. SBST1.insert(3, 'C');
  345. SBST1.update(2, 'D');
  346. queue = SBST1.getPostOrder();
  347. assert(queue->dequeue().second == 'A');
  348. assert(queue->dequeue().second == 'C');
  349. assert(queue->dequeue().second == 'D');
  350. delete queue;
  351. //===============================================
  352. SBST2.insert(3, 'C');
  353. SBST2.insert(2, 'B');
  354. SBST2.insert(1, 'A');
  355. SBST2.update(1, 'E');
  356. SBST2.update(2, 'B');
  357. queue = SBST2.getPostOrder();
  358. assert(queue->dequeue().second == 'E');
  359. assert(queue->dequeue().second == 'C');
  360. assert(queue->dequeue().second == 'B');
  361. delete queue;
  362. //===============================================
  363. SBST3.insert(2, 'B');
  364. SBST3.insert(1, 'A');
  365. SBST3.insert(3, 'C');
  366. SBST3.update(3, 'F');
  367. queue = SBST3.getPostOrder();
  368. assert(queue->dequeue().second == 'B');
  369. assert(queue->dequeue().second == 'A');
  370. assert(queue->dequeue().second == 'F');
  371. delete queue;
  372. //===============================================
  373. SBST4.insert(3, 'C');
  374. SBST4.insert(1, 'A');
  375. SBST4.insert(2, 'B');
  376. SBST4.update(3, 'D');
  377. SBST4.update(1, 'E');
  378. SBST4.update(2, 'F');
  379. queue = SBST4.getPostOrder();
  380. assert(queue->dequeue().second == 'E');
  381. assert(queue->dequeue().second == 'D');
  382. assert(queue->dequeue().second == 'F');
  383. delete queue;
  384. //===============================================
  385. SBST5.insert(1, 'A');
  386. SBST5.insert(3, 'C');
  387. SBST5.insert(2, 'B');
  388. SBST5.update(2, 'G');
  389. SBST5.update(2, 'E');
  390. SBST5.update(3, 'F');
  391. SBST5.update(2, 'M');
  392. queue = SBST5.getPostOrder();
  393. assert(queue->dequeue().second == 'A');
  394. assert(queue->dequeue().second == 'F');
  395. assert(queue->dequeue().second == 'M');
  396. delete queue;
  397. }
  398. /* SPLAYremoveTest - accomplishes the following
  399. * *Note: This tests splay functionality of SPLAVL
  400. *
  401. * *ensures we can't delete in empty tree
  402. *
  403. * *ensures each remove decreases the size by 1
  404. *
  405. * *for tests that check each removed element
  406. * is not in the tree, look at findTest
  407. *
  408. * *tests that each removed element results in tree
  409. * with elements in the right spot
  410. * by checking all four traversal algorithms on various remove
  411. * situations
  412. */
  413. void SPLAYRemoveTest() {
  414. SPLAVL<int, char> BST;
  415. BST.setMaxCount(1000);
  416. Queue< Pair<int,char> >* queue1;
  417. Queue< Pair<int,char> >* queue2;
  418. Queue< Pair<int,char> >* queue3;
  419. Queue< Pair<int,char> >* queue4;
  420. try{ // testing removing on an empty tree
  421. BST.remove(1);
  422. assert(false);
  423. } catch(runtime_error& exc){}
  424. BST.insert(2, 'B');
  425. BST.insert(1, 'A');
  426. BST.insert(5, 'E');
  427. BST.insert(3, 'C');
  428. BST.insert(4, 'D');
  429. assert(BST.getSize() == 5);
  430. try { // Testing remove on non-existant keys
  431. BST.remove(6);
  432. assert(false);
  433. } catch(runtime_error& exc){}
  434. try {
  435. BST.remove(0);
  436. assert(false);
  437. } catch(runtime_error& exc){}
  438. //===============================================
  439. /* The following is a comprehensive test of the SPLAVL::remove
  440. * function. We have designed the tree to test all possible
  441. * removal algorithms (right/left leaves, parent nodes with one
  442. * right/left child node, and parent node with two subchildren).
  443. * Tested with all four search algorithms.
  444. * The original tree looks like:
  445. */
  446. queue1 = BST.getPostOrder();
  447. queue2 = BST.getPreOrder();
  448. queue3 = BST.getInOrder();
  449. queue4 = BST.getLevelOrder();
  450. assert(queue1->dequeue().second == 'B');
  451. assert(queue1->dequeue().second == 'A');
  452. assert(queue1->dequeue().second == 'C');
  453. assert(queue1->dequeue().second == 'E');
  454. assert(queue1->dequeue().second == 'D');
  455. assert(queue2->dequeue().second == 'D');
  456. assert(queue2->dequeue().second == 'C');
  457. assert(queue2->dequeue().second == 'A');
  458. assert(queue2->dequeue().second == 'B');
  459. assert(queue2->dequeue().second == 'E');
  460. assert(queue3->dequeue().second == 'A');
  461. assert(queue3->dequeue().second == 'B');
  462. assert(queue3->dequeue().second == 'C');
  463. assert(queue3->dequeue().second == 'D');
  464. assert(queue3->dequeue().second == 'E');
  465. assert(queue4->dequeue().second == 'D');
  466. assert(queue4->dequeue().second == 'C');
  467. assert(queue4->dequeue().second == 'E');
  468. assert(queue4->dequeue().second == 'A');
  469. assert(queue4->dequeue().second == 'B');
  470. delete queue1;
  471. delete queue2;
  472. delete queue3;
  473. delete queue4;
  474. //===============================================
  475. BST.remove(2);
  476. assert(BST.getSize() == 4);
  477. queue1 = BST.getPostOrder();
  478. queue2 = BST.getPreOrder();
  479. queue3 = BST.getInOrder();
  480. queue4 = BST.getLevelOrder();
  481. assert(queue1->dequeue().second == 'A');
  482. assert(queue1->dequeue().second == 'C');
  483. assert(queue1->dequeue().second == 'E');
  484. assert(queue1->dequeue().second == 'D');
  485. assert(queue2->dequeue().second == 'D');
  486. assert(queue2->dequeue().second == 'C');
  487. assert(queue2->dequeue().second == 'A');
  488. assert(queue2->dequeue().second == 'E');
  489. assert(queue3->dequeue().second == 'A');
  490. assert(queue3->dequeue().second == 'C');
  491. assert(queue3->dequeue().second == 'D');
  492. assert(queue3->dequeue().second == 'E');
  493. assert(queue4->dequeue().second == 'D');
  494. assert(queue4->dequeue().second == 'C');
  495. assert(queue4->dequeue().second == 'E');
  496. assert(queue4->dequeue().second == 'A');
  497. delete queue1;
  498. delete queue2;
  499. delete queue3;
  500. delete queue4;
  501. //===============================================
  502. BST.remove(5);
  503. assert(BST.getSize() == 3);
  504. queue1 = BST.getPostOrder();
  505. queue2 = BST.getPreOrder();
  506. queue3 = BST.getInOrder();
  507. queue4 = BST.getLevelOrder();
  508. assert(queue1->dequeue().second == 'A');
  509. assert(queue1->dequeue().second == 'C');
  510. assert(queue1->dequeue().second == 'D');
  511. assert(queue2->dequeue().second == 'D');
  512. assert(queue2->dequeue().second == 'C');
  513. assert(queue2->dequeue().second == 'A');
  514. assert(queue3->dequeue().second == 'A');
  515. assert(queue3->dequeue().second == 'C');
  516. assert(queue3->dequeue().second == 'D');
  517. assert(queue4->dequeue().second == 'D');
  518. assert(queue4->dequeue().second == 'C');
  519. assert(queue4->dequeue().second == 'A');
  520. delete queue1;
  521. delete queue2;
  522. delete queue3;
  523. delete queue4;
  524. //===============================================
  525. BST.remove(1);
  526. assert(BST.getSize() == 2);
  527. queue1 = BST.getPostOrder();
  528. queue2 = BST.getPreOrder();
  529. queue3 = BST.getInOrder();
  530. queue4 = BST.getLevelOrder();
  531. assert(queue1->dequeue().second == 'C');
  532. assert(queue1->dequeue().second == 'D');
  533. assert(queue2->dequeue().second == 'D');
  534. assert(queue2->dequeue().second == 'C');
  535. assert(queue3->dequeue().second == 'C');
  536. assert(queue3->dequeue().second == 'D');
  537. assert(queue4->dequeue().second == 'D');
  538. assert(queue4->dequeue().second == 'C');
  539. delete queue1;
  540. delete queue2;
  541. delete queue3;
  542. delete queue4;
  543. //===============================================
  544. BST.remove(4);
  545. assert(BST.getSize() == 1);
  546. queue1 = BST.getPostOrder();
  547. queue2 = BST.getPreOrder();
  548. queue3 = BST.getInOrder();
  549. queue4 = BST.getLevelOrder();
  550. assert(queue1->dequeue().second == 'C');
  551. assert(queue2->dequeue().second == 'C');
  552. assert(queue3->dequeue().second == 'C');
  553. assert(queue4->dequeue().second == 'C');
  554. delete queue1;
  555. delete queue2;
  556. delete queue3;
  557. delete queue4;
  558. //===============================================
  559. BST.remove(3);
  560. assert(BST.getSize() == 0);
  561. queue1 = BST.getPostOrder();
  562. queue2 = BST.getPreOrder();
  563. queue3 = BST.getInOrder();
  564. queue4 = BST.getLevelOrder();
  565. assert(queue1->getSize() == 0);
  566. assert(queue2->getSize() == 0);
  567. assert(queue3->getSize() == 0);
  568. assert(queue4->getSize() == 0);
  569. delete queue1;
  570. delete queue2;
  571. delete queue3;
  572. delete queue4;
  573. }
  574. /* AVLremoveTest - accomplishes the following
  575. *
  576. * Note: this tests the AVL functionality of SPLAVL
  577. *
  578. * *ensures we can't delete in empty tree
  579. *
  580. * *ensures each remove decreases the size by 1
  581. *
  582. * *for tests that check each removed element
  583. * is not in the tree, look at findTest
  584. *
  585. * *tests that each removed element results in tree
  586. * with elements in the right spot
  587. * by checking all four traversal algorithms on various remove
  588. * situations
  589. */
  590. void AVLRemoveTest(){
  591. SPLAVL<int,int> AVL;
  592. AVL.setMaxRatio(-1);
  593. //Our insertTest method makes sure that the balancing calls
  594. //do what they should. The only case to take care of is
  595. //when we delete a leaf node (and we call balance on NULL.
  596. //This adds a bunch of elements and then
  597. //deletes a bunch of elements, and makes sure things still stay
  598. //balanced.
  599. assert(AVL.getSize() == 0); // Checks that initial size is correct. assert
  600. // causes the program to immediately crash if
  601. // the condition is false.
  602. for (int i = 0; i < 100; ++i) {
  603. AVL.insert(2*i + 1, i);
  604. assert(AVL.isBalanced());
  605. assert(AVL.getSize() == i+1);
  606. }
  607. for (int i = 0; i < 100; ++i) { // Checks that keys are in the tree.
  608. assert(AVL.contains(2*i + 1));
  609. }
  610. for (int i = 0; i < 100; ++i) {
  611. AVL.insert(-2*i - 1, i);
  612. assert(AVL.isBalanced());
  613. assert(AVL.getSize() == i+1 + 100);
  614. }
  615. for (int i = 0; i < 100; ++i) { // Checks that keys are in the tree.
  616. assert(AVL.contains(-2*i - 1));
  617. }
  618. for (int i = 0; i < 100; ++i) {
  619. AVL.remove(-2*i - 1);
  620. assert(AVL.isBalanced());
  621. assert(AVL.getSize() == 199 - i);
  622. }
  623. for (int i = 0; i < 100; ++i) {
  624. AVL.remove(2*(99-i) + 1);
  625. assert(AVL.isBalanced());
  626. assert(AVL.getSize() == 99 - i);
  627. }
  628. assert(AVL.getSize() == 0);
  629. }
  630. /* AVLInsertTest - accomplishes the following
  631. *
  632. * *Note: This tests AVL functionality of SPLAVL
  633. *
  634. * *tests tree is balanced after series of insertions and removals
  635. *
  636. * *tests that each kind of imbalance is properly adjusted for
  637. */
  638. void AVLInsertTest(){
  639. SPLAVL<int,int> AVL;
  640. SPLAVL<int, char> SAVL1, SAVL2, SAVL3, SAVL4, SAVL5;
  641. AVL.setMaxRatio(-1);
  642. SAVL1.setMaxRatio(0);
  643. SAVL2.setMaxRatio(0);
  644. SAVL3.setMaxRatio(0);
  645. SAVL4.setMaxRatio(0);
  646. SAVL5.setMaxRatio(0);
  647. Queue< Pair<int,char> >* queue1;
  648. Queue< Pair<int,char> >* queue2;
  649. Queue< Pair<int,char> >* queue3;
  650. Queue< Pair<int,char> >* queue4;
  651. assert(AVL.getSize() == 0); // Checks that initial size is correct. assert
  652. // causes the program to immediately crash if
  653. // the condition is false.
  654. for (int i = 0; i < 100; ++i) {
  655. AVL.insert(2*i + 1, i);
  656. assert(AVL.isBalanced());
  657. assert(AVL.getSize() == i+1);
  658. }
  659. for (int i = 0; i < 100; ++i) { // Checks that keys are in the tree.
  660. assert(AVL.contains(2*i + 1));
  661. }
  662. for (int i = 0; i < 100; ++i) {
  663. AVL.insert(-2*i - 1, i);
  664. assert(AVL.isBalanced());
  665. assert(AVL.getSize() == i+1 + 100);
  666. }
  667. for (int i = 0; i < 100; ++i) { // Checks that keys are in the tree.
  668. assert(AVL.contains(-2*i - 1));
  669. }
  670. for (int i = 0; i < 100; ++i) { //Error returned if key already exists.
  671. try{
  672. AVL.insert(2*i + 1, i);
  673. assert(false);
  674. } catch(runtime_error& exc){}
  675. }
  676. assert(AVL.isBalanced());
  677. //===============================================
  678. // The following tests use inserts that create LL, LR, RL, RR imbalances.
  679. // They ensure that the tree is balanced in the right way.
  680. assert(SAVL1.getSize() == 0);
  681. SAVL1.insert(1, 'A');
  682. SAVL1.insert(2, 'B');
  683. SAVL1.insert(3, 'C');
  684. queue1 = SAVL1.getPostOrder();
  685. queue2 = SAVL1.getPreOrder();
  686. queue3 = SAVL1.getInOrder();
  687. queue4 = SAVL1.getLevelOrder();
  688. assert(queue1->dequeue().second == 'A');
  689. assert(queue1->dequeue().second == 'C');
  690. assert(queue1->dequeue().second == 'B');
  691. assert(queue2->dequeue().second == 'B');
  692. assert(queue2->dequeue().second == 'A');
  693. assert(queue2->dequeue().second == 'C');
  694. assert(queue3->dequeue().second == 'A');
  695. assert(queue3->dequeue().second == 'B');
  696. assert(queue3->dequeue().second == 'C');
  697. assert(queue4->dequeue().second == 'B');
  698. assert(queue4->dequeue().second == 'A');
  699. assert(queue4->dequeue().second == 'C');
  700. delete queue1;
  701. delete queue2;
  702. delete queue3;
  703. delete queue4;
  704. //===============================================
  705. assert(SAVL2.getSize() == 0);
  706. SAVL2.insert(3, 'C');
  707. SAVL2.insert(2, 'B');
  708. SAVL2.insert(1, 'A');
  709. queue1 = SAVL2.getPostOrder();
  710. queue2 = SAVL2.getPreOrder();
  711. queue3 = SAVL2.getInOrder();
  712. queue4 = SAVL2.getLevelOrder();
  713. assert(queue1->dequeue().second == 'A');
  714. assert(queue1->dequeue().second == 'C');
  715. assert(queue1->dequeue().second == 'B');
  716. assert(queue2->dequeue().second == 'B');
  717. assert(queue2->dequeue().second == 'A');
  718. assert(queue2->dequeue().second == 'C');
  719. assert(queue3->dequeue().second == 'A');
  720. assert(queue3->dequeue().second == 'B');
  721. assert(queue3->dequeue().second == 'C');
  722. assert(queue4->dequeue().second == 'B');
  723. assert(queue4->dequeue().second == 'A');
  724. assert(queue4->dequeue().second == 'C');
  725. delete queue1;
  726. delete queue2;
  727. delete queue3;
  728. delete queue4;
  729. //===============================================
  730. assert(SAVL3.getSize() == 0);
  731. SAVL3.insert(2, 'B');
  732. SAVL3.insert(1, 'A');
  733. SAVL3.insert(3, 'C');
  734. queue1 = SAVL3.getPostOrder();
  735. queue2 = SAVL3.getPreOrder();
  736. queue3 = SAVL3.getInOrder();
  737. queue4 = SAVL3.getLevelOrder();
  738. assert(queue1->dequeue().second == 'A');
  739. assert(queue1->dequeue().second == 'C');
  740. assert(queue1->dequeue().second == 'B');
  741. assert(queue2->dequeue().second == 'B');
  742. assert(queue2->dequeue().second == 'A');
  743. assert(queue2->dequeue().second == 'C');
  744. assert(queue3->dequeue().second == 'A');
  745. assert(queue3->dequeue().second == 'B');
  746. assert(queue3->dequeue().second == 'C');
  747. assert(queue4->dequeue().second == 'B');
  748. assert(queue4->dequeue().second == 'A');
  749. assert(queue4->dequeue().second == 'C');
  750. delete queue1;
  751. delete queue2;
  752. delete queue3;
  753. delete queue4;
  754. //===============================================
  755. assert(SAVL4.getSize() == 0);
  756. SAVL4.insert(3, 'C');
  757. SAVL4.insert(1, 'A');
  758. SAVL4.insert(2, 'B');
  759. queue1 = SAVL4.getPostOrder();
  760. queue2 = SAVL4.getPreOrder();
  761. queue3 = SAVL4.getInOrder();
  762. queue4 = SAVL4.getLevelOrder();
  763. assert(queue1->dequeue().second == 'A');
  764. assert(queue1->dequeue().second == 'C');
  765. assert(queue1->dequeue().second == 'B');
  766. assert(queue2->dequeue().second == 'B');
  767. assert(queue2->dequeue().second == 'A');
  768. assert(queue2->dequeue().second == 'C');
  769. assert(queue3->dequeue().second == 'A');
  770. assert(queue3->dequeue().second == 'B');
  771. assert(queue3->dequeue().second == 'C');
  772. assert(queue4->dequeue().second == 'B');
  773. assert(queue4->dequeue().second == 'A');
  774. assert(queue4->dequeue().second == 'C');
  775. delete queue1;
  776. delete queue2;
  777. delete queue3;
  778. delete queue4;
  779. //===============================================
  780. assert(SAVL5.getSize() == 0);
  781. SAVL5.insert(1, 'A');
  782. SAVL5.insert(3, 'C');
  783. SAVL5.insert(2, 'B');
  784. queue1 = SAVL5.getPostOrder();
  785. queue2 = SAVL5.getPreOrder();
  786. queue3 = SAVL5.getInOrder();
  787. queue4 = SAVL5.getLevelOrder();
  788. assert(queue1->dequeue().second == 'A');
  789. assert(queue1->dequeue().second == 'C');
  790. assert(queue1->dequeue().second == 'B');
  791. assert(queue2->dequeue().second == 'B');
  792. assert(queue2->dequeue().second == 'A');
  793. assert(queue2->dequeue().second == 'C');
  794. assert(queue3->dequeue().second == 'A');
  795. assert(queue3->dequeue().second == 'B');
  796. assert(queue3->dequeue().second == 'C');
  797. assert(queue4->dequeue().second == 'B');
  798. assert(queue4->dequeue().second == 'A');
  799. assert(queue4->dequeue().second == 'C');
  800. delete queue1;
  801. delete queue2;
  802. delete queue3;
  803. delete queue4;
  804. }
  805. /* SPLAVLinsertTest
  806. *
  807. * *This function tests hybridized inserts
  808. *
  809. * *It ensures elements go to the right
  810. * spot depending on maxRatio and maxCount
  811. */
  812. void SPLAVLinsertTest(){
  813. SPLAVL<int, int> SPLAVL;
  814. Queue< Pair<int,int> >* queue1;
  815. Queue< Pair<int,int> >* queue2;
  816. Queue< Pair<int,int> >* queue3;
  817. Queue< Pair<int,int> >* queue4;
  818. SPLAVL.setMaxRatio(0);
  819. SPLAVL.setMaxCount(5);
  820. for (int i = 1; i<=4; i++){
  821. SPLAVL.insert(i, i);
  822. }
  823. //===============================================
  824. queue1 = SPLAVL.getPostOrder();
  825. queue2 = SPLAVL.getPreOrder();
  826. queue3 = SPLAVL.getInOrder();
  827. queue4 = SPLAVL.getLevelOrder();
  828. assert(queue1->dequeue().second == 1);
  829. assert(queue1->dequeue().second == 2);
  830. assert(queue1->dequeue().second == 3);
  831. assert(queue1->dequeue().second == 4);
  832. assert(queue2->dequeue().second == 4);
  833. assert(queue2->dequeue().second == 3);
  834. assert(queue2->dequeue().second == 2);
  835. assert(queue2->dequeue().second == 1);
  836. assert(queue3->dequeue().second == 1);
  837. assert(queue3->dequeue().second == 2);
  838. assert(queue3->dequeue().second == 3);
  839. assert(queue3->dequeue().second == 4);
  840. assert(queue4->dequeue().second == 4);
  841. assert(queue4->dequeue().second == 3);
  842. assert(queue4->dequeue().second == 2);
  843. assert(queue4->dequeue().second == 1);
  844. delete queue1;
  845. delete queue2;
  846. delete queue3;
  847. delete queue4;
  848. //===============================================
  849. SPLAVL.insert(5,5);
  850. queue1 = SPLAVL.getPostOrder();
  851. queue2 = SPLAVL.getPreOrder();
  852. queue3 = SPLAVL.getInOrder();
  853. queue4 = SPLAVL.getLevelOrder();
  854. assert(queue1->dequeue().second == 1);
  855. assert(queue1->dequeue().second == 2);
  856. assert(queue1->dequeue().second == 5);
  857. assert(queue1->dequeue().second == 4);
  858. assert(queue1->dequeue().second == 3);
  859. assert(queue2->dequeue().second == 3);
  860. assert(queue2->dequeue().second == 2);
  861. assert(queue2->dequeue().second == 1);
  862. assert(queue2->dequeue().second == 4);
  863. assert(queue2->dequeue().second == 5);
  864. assert(queue3->dequeue().second == 1);
  865. assert(queue3->dequeue().second == 2);
  866. assert(queue3->dequeue().second == 3);
  867. assert(queue3->dequeue().second == 4);
  868. assert(queue3->dequeue().second == 5);
  869. assert(queue4->dequeue().second == 3);
  870. assert(queue4->dequeue().second == 2);
  871. assert(queue4->dequeue().second == 4);
  872. assert(queue4->dequeue().second == 1);
  873. assert(queue4->dequeue().second == 5);
  874. delete queue1;
  875. delete queue2;
  876. delete queue3;
  877. delete queue4;
  878. //===============================================
  879. SPLAVL.insert(6,6);
  880. queue1 = SPLAVL.getPostOrder();
  881. queue2 = SPLAVL.getPreOrder();
  882. queue3 = SPLAVL.getInOrder();
  883. queue4 = SPLAVL.getLevelOrder();
  884. assert(queue1->dequeue().second == 1);
  885. assert(queue1->dequeue().second == 2);
  886. assert(queue1->dequeue().second == 5);
  887. assert(queue1->dequeue().second == 4);
  888. assert(queue1->dequeue().second == 3);
  889. assert(queue1->dequeue().second == 6);
  890. assert(queue2->dequeue().second == 6);
  891. assert(queue2->dequeue().second == 3);
  892. assert(queue2->dequeue().second == 2);
  893. assert(queue2->dequeue().second == 1);
  894. assert(queue2->dequeue().second == 4);
  895. assert(queue2->dequeue().second == 5);
  896. assert(queue3->dequeue().second == 1);
  897. assert(queue3->dequeue().second == 2);
  898. assert(queue3->dequeue().second == 3);
  899. assert(queue3->dequeue().second == 4);
  900. assert(queue3->dequeue().second == 5);
  901. assert(queue3->dequeue().second == 6);
  902. assert(queue4->dequeue().second == 6);
  903. assert(queue4->dequeue().second == 3);
  904. assert(queue4->dequeue().second == 2);
  905. assert(queue4->dequeue().second == 4);
  906. assert(queue4->dequeue().second == 1);
  907. assert(queue4->dequeue().second == 5);
  908. delete queue1;
  909. delete queue2;
  910. delete queue3;
  911. delete queue4;
  912. }