testSplay.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859
  1. /*Dylan Jeffers
  2. *Tahmid Rahman
  3. *founders of RahmROMJeffers ltd.
  4. *
  5. *Test script for BST and AVL - AVL tests
  6. *are at the bottom of the script
  7. */
  8. #include <stdlib.h> // Used for pseudo-random number generation.
  9. #include <assert.h> // Used for testing below.
  10. #include <iostream>
  11. #include "pair.h"
  12. #include "BST.h"
  13. #include "library/circularArrayList.h"
  14. #include "library/queue.h"
  15. #include "AVLTree.h"
  16. #include "SplayTree.h"
  17. using namespace std;
  18. void insertTest();
  19. void updateTest();
  20. void removeTest();
  21. void findTest();
  22. void testMaxMin();
  23. void testgetHeight();
  24. int main() {
  25. insertTest();
  26. findTest();
  27. updateTest();
  28. testMaxMin();
  29. removeTest();
  30. testgetHeight();
  31. cout << "Passed SplayTree tests!" << endl;
  32. return 0;
  33. }
  34. /* insertTest - accomplishes the following
  35. * *tests getSize
  36. *
  37. * *ensures a new tree is indeed empty
  38. *
  39. * *ensures each insert increases the size by 1
  40. *
  41. * *tests that each inserted element is in the tree
  42. *
  43. * *tests that each inserted element is splayed to the right spot
  44. * by checking all four traversal algorithms on all five
  45. * elementary subtrees (i.e. with 3 nodes)
  46. */
  47. void insertTest() {
  48. SplayTree<int,int> BST;
  49. //Queue< Pair<int,int> >* queue0;
  50. SplayTree<int, char> SBST1, SBST2, SBST3, SBST4, SBST5, SBST6;
  51. Queue< Pair<int,char> >* queue1;
  52. Queue< Pair<int,char> >* queue2;
  53. Queue< Pair<int,char> >* queue3;
  54. Queue< Pair<int,char> >* queue4;
  55. assert(BST.getSize() == 0); // Checks that initial size is correct. assert
  56. // causes the program to immediately crash if
  57. // the condition is false.
  58. for (int i = 0; i < 100; ++i) {
  59. BST.insert(2*i + 1, i);
  60. assert(BST.getSize() == i+1);
  61. assert(BST.getRootKey() == 2*i+1);
  62. }
  63. /* queue0 = BST.getInOrder();
  64. while (!queue0->isEmpty()) {
  65. cout << queue0->dequeue().second << " ";
  66. cout.flush();
  67. }
  68. */
  69. for (int i = 0; i < 100; ++i) { // Checks that keys are in the tree.
  70. assert(BST.contains(2*i + 1));
  71. assert(BST.getRootKey() == 2*i+1);
  72. }
  73. for (int i = 0; i < 100; ++i) {
  74. BST.insert(-2*i - 1, i);
  75. assert(BST.getSize() == i+1 + 100);
  76. cout.flush();
  77. }
  78. for (int i = 0; i < 100; ++i) { // Checks that keys are in the tree.
  79. assert(BST.contains(-2*i - 1));
  80. assert(BST.getRootKey() == -2*i-1);
  81. }
  82. for (int i = 0; i < 100; ++i) { //Error returned if key already exists.
  83. try{
  84. BST.insert(2*i + 1, i);
  85. assert(false);
  86. } catch(runtime_error& exc){}
  87. }
  88. //===============================================
  89. /* The following tests each tree traversal algorithm on
  90. * all five elementary subtrees.
  91. */
  92. SBST1.insert(1, 'A');
  93. SBST1.insert(2, 'B');
  94. SBST1.insert(3, 'C');
  95. queue1 = SBST1.getPostOrder();
  96. queue2 = SBST1.getPreOrder();
  97. queue3 = SBST1.getInOrder();
  98. queue4 = SBST1.getLevelOrder();
  99. assert(queue1->dequeue().second == 'A');
  100. assert(queue1->dequeue().second == 'B');
  101. assert(queue1->dequeue().second == 'C');
  102. assert(queue2->dequeue().second == 'C');
  103. assert(queue2->dequeue().second == 'B');
  104. assert(queue2->dequeue().second == 'A');
  105. assert(queue3->dequeue().second == 'A');
  106. assert(queue3->dequeue().second == 'B');
  107. assert(queue3->dequeue().second == 'C');
  108. assert(queue4->dequeue().second == 'C');
  109. assert(queue4->dequeue().second == 'B');
  110. assert(queue4->dequeue().second == 'A');
  111. delete queue1;
  112. delete queue2;
  113. delete queue3;
  114. delete queue4;
  115. //===============================================
  116. SBST2.insert(3, 'C');
  117. SBST2.insert(2, 'B');
  118. SBST2.insert(1, 'A');
  119. queue1 = SBST2.getPostOrder();
  120. queue2 = SBST2.getPreOrder();
  121. queue3 = SBST2.getInOrder();
  122. queue4 = SBST2.getLevelOrder();
  123. assert(queue1->dequeue().second == 'C');
  124. assert(queue1->dequeue().second == 'B');
  125. assert(queue1->dequeue().second == 'A');
  126. assert(queue2->dequeue().second == 'A');
  127. assert(queue2->dequeue().second == 'B');
  128. assert(queue2->dequeue().second == 'C');
  129. assert(queue3->dequeue().second == 'A');
  130. assert(queue3->dequeue().second == 'B');
  131. assert(queue3->dequeue().second == 'C');
  132. assert(queue4->dequeue().second == 'A');
  133. assert(queue4->dequeue().second == 'B');
  134. assert(queue4->dequeue().second == 'C');
  135. delete queue1;
  136. delete queue2;
  137. delete queue3;
  138. delete queue4;
  139. //===============================================
  140. SBST3.insert(2, 'B');
  141. SBST3.insert(1, 'A');
  142. SBST3.insert(3, 'C');
  143. queue1 = SBST3.getPostOrder();
  144. queue2 = SBST3.getPreOrder();
  145. queue3 = SBST3.getInOrder();
  146. queue4 = SBST3.getLevelOrder();
  147. assert(queue1->dequeue().second == 'A');
  148. assert(queue1->dequeue().second == 'B');
  149. assert(queue1->dequeue().second == 'C');
  150. assert(queue2->dequeue().second == 'C');
  151. assert(queue2->dequeue().second == 'B');
  152. assert(queue2->dequeue().second == 'A');
  153. assert(queue3->dequeue().second == 'A');
  154. assert(queue3->dequeue().second == 'B');
  155. assert(queue3->dequeue().second == 'C');
  156. assert(queue4->dequeue().second == 'C');
  157. assert(queue4->dequeue().second == 'B');
  158. assert(queue4->dequeue().second == 'A');
  159. delete queue1;
  160. delete queue2;
  161. delete queue3;
  162. delete queue4;
  163. //===============================================
  164. SBST4.insert(3, 'C');
  165. SBST4.insert(1, 'A');
  166. SBST4.insert(2, 'B');
  167. queue1 = SBST4.getPostOrder();
  168. queue2 = SBST4.getPreOrder();
  169. queue3 = SBST4.getInOrder();
  170. queue4 = SBST4.getLevelOrder();
  171. assert(queue1->dequeue().second == 'A');
  172. assert(queue1->dequeue().second == 'C');
  173. assert(queue1->dequeue().second == 'B');
  174. assert(queue2->dequeue().second == 'B');
  175. assert(queue2->dequeue().second == 'A');
  176. assert(queue2->dequeue().second == 'C');
  177. assert(queue3->dequeue().second == 'A');
  178. assert(queue3->dequeue().second == 'B');
  179. assert(queue3->dequeue().second == 'C');
  180. assert(queue4->dequeue().second == 'B');
  181. assert(queue4->dequeue().second == 'A');
  182. assert(queue4->dequeue().second == 'C');
  183. delete queue1;
  184. delete queue2;
  185. delete queue3;
  186. delete queue4;
  187. //===============================================
  188. SBST5.insert(1, 'A');
  189. SBST5.insert(3, 'C');
  190. SBST5.insert(2, 'B');
  191. queue1 = SBST5.getPostOrder();
  192. queue2 = SBST5.getPreOrder();
  193. queue3 = SBST5.getInOrder();
  194. queue4 = SBST5.getLevelOrder();
  195. assert(queue1->dequeue().second == 'A');
  196. assert(queue1->dequeue().second == 'C');
  197. assert(queue1->dequeue().second == 'B');
  198. assert(queue2->dequeue().second == 'B');
  199. assert(queue2->dequeue().second == 'A');
  200. assert(queue2->dequeue().second == 'C');
  201. assert(queue3->dequeue().second == 'A');
  202. assert(queue3->dequeue().second == 'B');
  203. assert(queue3->dequeue().second == 'C');
  204. assert(queue4->dequeue().second == 'B');
  205. assert(queue4->dequeue().second == 'A');
  206. assert(queue4->dequeue().second == 'C');
  207. delete queue1;
  208. delete queue2;
  209. delete queue3;
  210. delete queue4;
  211. //===============================================
  212. SBST6.insert(2, 'B');
  213. SBST6.insert(3, 'C');
  214. SBST6.insert(1, 'A');
  215. queue1 = SBST6.getPostOrder();
  216. queue2 = SBST6.getPreOrder();
  217. queue3 = SBST6.getInOrder();
  218. queue4 = SBST6.getLevelOrder();
  219. assert(queue1->dequeue().second == 'C');
  220. assert(queue1->dequeue().second == 'B');
  221. assert(queue1->dequeue().second == 'A');
  222. assert(queue2->dequeue().second == 'A');
  223. assert(queue2->dequeue().second == 'B');
  224. assert(queue2->dequeue().second == 'C');
  225. assert(queue3->dequeue().second == 'A');
  226. assert(queue3->dequeue().second == 'B');
  227. assert(queue3->dequeue().second == 'C');
  228. assert(queue4->dequeue().second == 'A');
  229. assert(queue4->dequeue().second == 'B');
  230. assert(queue4->dequeue().second == 'C');
  231. delete queue1;
  232. delete queue2;
  233. delete queue3;
  234. delete queue4;
  235. }
  236. /* findTest - accomplishes the following
  237. *
  238. * *tests that each removed element
  239. * is not in the tree
  240. *
  241. * *tests that right value is returned when find is called
  242. */
  243. void findTest() {
  244. SplayTree<int,int> BST;
  245. SplayTree<int, char> BST2;
  246. assert(BST.getSize() == 0); // Checks that initial size is correct.
  247. for (int i = 0; i < 100; ++i) {
  248. BST.insert(2*i + 1, i);
  249. assert(BST.getSize() == i+1);
  250. }
  251. for (int i = 0; i < 100; ++i) { // Checks that keys are in the tree.
  252. assert(BST.find(2*i + 1) == i);
  253. assert(BST.getRootKey() == 2*i+1);
  254. }
  255. for (int i = 0; i < 100; ++i) { // Checks that key returns proper update.
  256. BST.update(2*i + 1, 2*i);
  257. assert(BST.find(2*i + 1) == 2*i);
  258. assert(BST.getRootKey() == 2*i+1);
  259. }
  260. try{ // Testing edge cases
  261. BST.find(0);
  262. assert(BST.getRootKey() == 199);
  263. assert(false);
  264. } catch(runtime_error& exc){}
  265. try{
  266. BST.find(2*99 + 2);
  267. assert(false);
  268. } catch(runtime_error& exc){}
  269. BST2.insert(4, 'D');
  270. assert(BST2.getRootKey() == 4);
  271. BST2.insert(3, 'C');
  272. assert(BST2.getRootKey() == 3);
  273. BST2.insert(5, 'E');
  274. assert(BST2.getRootKey() == 5);
  275. BST2.insert(1, 'A');
  276. assert(BST2.getRootKey() == 1);
  277. BST2.insert(2, 'B');
  278. assert(BST2.getRootKey() == 2);
  279. assert(BST2.find(4) == 'D');
  280. assert(BST2.getRootKey() == 4);
  281. BST2.remove(4);
  282. try{
  283. BST2.find(4);
  284. assert(false);
  285. } catch(runtime_error& exc){}
  286. assert(BST2.find(2) == 'B');
  287. assert(BST2.getRootKey() == 2);
  288. BST2.remove(2);
  289. try{
  290. BST2.find(2);
  291. assert(false);
  292. } catch(runtime_error& exc){}
  293. assert(BST2.find(1) == 'A');
  294. assert(BST2.getRootKey() == 1);
  295. BST2.remove(1);
  296. try{
  297. BST2.find(1);
  298. assert(false);
  299. } catch(runtime_error& exc){}
  300. assert(BST2.find(3) == 'C');
  301. assert(BST2.getRootKey() == 3);
  302. BST2.remove(3);
  303. try{
  304. BST2.find(3);
  305. assert(false);
  306. } catch(runtime_error& exc){}
  307. assert(BST2.find(5) == 'E');
  308. assert(BST2.getRootKey() == 5);
  309. BST2.remove(5);
  310. try{
  311. BST2.find(5);
  312. assert(false);
  313. } catch(runtime_error& exc){}
  314. }
  315. /* updateTest - accomplishes the following
  316. * *tests that update returns error if key is
  317. * not in tree
  318. *
  319. * *tests that each updated element is in the right spot
  320. * by checking on all five elementary subtrees (i.e. with 3 nodes)
  321. */
  322. void updateTest(){
  323. SplayTree<int, char> SBST1, SBST2, SBST3, SBST4, SBST5;
  324. Queue< Pair<int,char> >* queue;
  325. SplayTree<int, int> BST;
  326. assert(BST.getSize() == 0); // Checks that initial size is correct.
  327. try{ // errors returned when key does not exist in subtree
  328. BST.update(5, 10);
  329. assert(false);
  330. } catch(runtime_error& exc){}
  331. for (int i = 0; i < 100; ++i) { //inserts and updates 100 elements
  332. BST.insert(2*i + 1, i);
  333. assert(BST.contains(2*i + 1));
  334. assert(BST.getRootKey() == 2*i + 1);
  335. BST.update(2*i + 1, 2*i);
  336. assert(BST.getSize() == i+1);
  337. assert(BST.getRootKey() == 2*i + 1);
  338. }
  339. try{
  340. BST.update(2*99 + 2, 100);
  341. assert(false);
  342. } catch(runtime_error& exc){}
  343. for (int i = 0; i < 100; ++i) { // Checks that keys haven't been changed
  344. assert(BST.contains(2*i + 1));
  345. assert(BST.getRootKey() == 2*i + 1);
  346. }
  347. SBST1.insert(1, 'A');
  348. SBST1.insert(2, 'B');
  349. SBST1.insert(3, 'C');
  350. SBST1.update(2, 'D');
  351. queue = SBST1.getPostOrder();
  352. assert(SBST1.getRootKey() == 2);
  353. assert(queue->dequeue().second == 'A');
  354. assert(queue->dequeue().second == 'C');
  355. assert(queue->dequeue().second == 'D');
  356. delete queue;
  357. //===============================================
  358. SBST2.insert(3, 'C');
  359. SBST2.insert(2, 'B');
  360. SBST2.insert(1, 'A');
  361. SBST2.update(1, 'E');
  362. SBST2.update(2, 'B');
  363. queue = SBST2.getPostOrder();
  364. assert(SBST2.getRootKey() == 2);
  365. assert(queue->dequeue().second == 'E');
  366. assert(queue->dequeue().second == 'C');
  367. assert(queue->dequeue().second == 'B');
  368. delete queue;
  369. //===============================================
  370. SBST3.insert(2, 'B');
  371. SBST3.insert(1, 'A');
  372. SBST3.insert(3, 'C');
  373. SBST3.update(3, 'F');
  374. queue = SBST3.getPostOrder();
  375. assert(SBST3.getRootKey() == 3);
  376. assert(queue->dequeue().second == 'A');
  377. assert(queue->dequeue().second == 'B');
  378. assert(queue->dequeue().second == 'F');
  379. delete queue;
  380. //===============================================
  381. SBST4.insert(3, 'C');
  382. SBST4.insert(1, 'A');
  383. SBST4.insert(2, 'B');
  384. SBST4.update(3, 'D');
  385. SBST4.update(1, 'E');
  386. SBST4.update(2, 'F');
  387. queue = SBST4.getPostOrder();
  388. assert(SBST4.getRootKey() == 2);
  389. assert(queue->dequeue().second == 'E');
  390. assert(queue->dequeue().second == 'D');
  391. assert(queue->dequeue().second == 'F');
  392. delete queue;
  393. //===============================================
  394. SBST5.insert(1, 'A');
  395. SBST5.insert(3, 'C');
  396. SBST5.insert(2, 'B');
  397. SBST5.update(2, 'G');
  398. SBST5.update(2, 'E');
  399. SBST5.update(3, 'F');
  400. SBST5.update(2, 'M');
  401. queue = SBST5.getPostOrder();
  402. assert(SBST5.getRootKey() == 2);
  403. assert(queue->dequeue().second == 'A');
  404. assert(queue->dequeue().second == 'F');
  405. assert(queue->dequeue().second == 'M');
  406. delete queue;
  407. }
  408. /* removeTest - accomplishes the following
  409. *
  410. * *ensures we can't delete in empty tree
  411. *
  412. * *ensures each remove decreases the size by 1
  413. *
  414. * *for tests that check each removed element
  415. * is not in the tree, look at findTest
  416. *
  417. * *tests that each removed element results in tree
  418. * with elements in the right spot
  419. * by checking all four traversal algorithms on all remove
  420. * situations
  421. */
  422. void removeTest() {
  423. SplayTree<int, char> BST;
  424. Queue< Pair<int,char> >* queue1;
  425. Queue< Pair<int,char> >* queue2;
  426. Queue< Pair<int,char> >* queue3;
  427. Queue< Pair<int,char> >* queue4;
  428. try{ // testing removing on an empty tree
  429. BST.remove(1);
  430. assert(false);
  431. } catch(runtime_error& exc){}
  432. BST.insert(2, 'B');
  433. BST.insert(1, 'A');
  434. BST.insert(5, 'E');
  435. BST.insert(3, 'C');
  436. BST.insert(4, 'D');
  437. assert(BST.getSize() == 5);
  438. try { // Testing remove on non-existant keys
  439. BST.remove(6);
  440. assert(false);
  441. } catch(runtime_error& exc){}
  442. try {
  443. BST.remove(0);
  444. assert(false);
  445. } catch(runtime_error& exc){}
  446. //===============================================
  447. /* The following is a comprehensive test of the SplayTree::remove
  448. * function. We have designed the tree to test all possible
  449. * removal algorithms (right/left leaves, parent nodes with one
  450. * right/left child node, and parent node with two subchildren).
  451. * Tested with all four search algorithms.
  452. * The original tree looks like:
  453. */
  454. queue1 = BST.getPostOrder();
  455. queue2 = BST.getPreOrder();
  456. queue3 = BST.getInOrder();
  457. queue4 = BST.getLevelOrder();
  458. assert(queue1->dequeue().second == 'A');
  459. assert(queue1->dequeue().second == 'B');
  460. assert(queue1->dequeue().second == 'C');
  461. assert(queue1->dequeue().second == 'E');
  462. assert(queue1->dequeue().second == 'D');
  463. assert(queue2->dequeue().second == 'D');
  464. assert(queue2->dequeue().second == 'C');
  465. assert(queue2->dequeue().second == 'B');
  466. assert(queue2->dequeue().second == 'A');
  467. assert(queue2->dequeue().second == 'E');
  468. assert(queue3->dequeue().second == 'A');
  469. assert(queue3->dequeue().second == 'B');
  470. assert(queue3->dequeue().second == 'C');
  471. assert(queue3->dequeue().second == 'D');
  472. assert(queue3->dequeue().second == 'E');
  473. assert(queue4->dequeue().second == 'D');
  474. assert(queue4->dequeue().second == 'C');
  475. assert(queue4->dequeue().second == 'E');
  476. assert(queue4->dequeue().second == 'B');
  477. assert(queue4->dequeue().second == 'A');
  478. delete queue1;
  479. delete queue2;
  480. delete queue3;
  481. delete queue4;
  482. //===============================================
  483. BST.remove(2);
  484. assert(BST.getSize() == 4);
  485. queue1 = BST.getPostOrder();
  486. queue2 = BST.getPreOrder();
  487. queue3 = BST.getInOrder();
  488. queue4 = BST.getLevelOrder();
  489. assert(queue1->dequeue().second == 'A');
  490. assert(queue1->dequeue().second == 'C');
  491. assert(queue1->dequeue().second == 'E');
  492. assert(queue1->dequeue().second == 'D');
  493. assert(queue2->dequeue().second == 'D');
  494. assert(queue2->dequeue().second == 'C');
  495. assert(queue2->dequeue().second == 'A');
  496. assert(queue2->dequeue().second == 'E');
  497. assert(queue3->dequeue().second == 'A');
  498. assert(queue3->dequeue().second == 'C');
  499. assert(queue3->dequeue().second == 'D');
  500. assert(queue3->dequeue().second == 'E');
  501. assert(queue4->dequeue().second == 'D');
  502. assert(queue4->dequeue().second == 'C');
  503. assert(queue4->dequeue().second == 'E');
  504. assert(queue4->dequeue().second == 'A');
  505. delete queue1;
  506. delete queue2;
  507. delete queue3;
  508. delete queue4;
  509. //===============================================
  510. BST.remove(5);
  511. assert(BST.getSize() == 3);
  512. queue1 = BST.getPostOrder();
  513. queue2 = BST.getPreOrder();
  514. queue3 = BST.getInOrder();
  515. queue4 = BST.getLevelOrder();
  516. assert(queue1->dequeue().second == 'A');
  517. assert(queue1->dequeue().second == 'C');
  518. assert(queue1->dequeue().second == 'D');
  519. assert(queue2->dequeue().second == 'D');
  520. assert(queue2->dequeue().second == 'C');
  521. assert(queue2->dequeue().second == 'A');
  522. assert(queue3->dequeue().second == 'A');
  523. assert(queue3->dequeue().second == 'C');
  524. assert(queue3->dequeue().second == 'D');
  525. assert(queue4->dequeue().second == 'D');
  526. assert(queue4->dequeue().second == 'C');
  527. assert(queue4->dequeue().second == 'A');
  528. delete queue1;
  529. delete queue2;
  530. delete queue3;
  531. delete queue4;
  532. //===============================================
  533. BST.remove(1);
  534. assert(BST.getSize() == 2);
  535. queue1 = BST.getPostOrder();
  536. queue2 = BST.getPreOrder();
  537. queue3 = BST.getInOrder();
  538. queue4 = BST.getLevelOrder();
  539. assert(queue1->dequeue().second == 'C');
  540. assert(queue1->dequeue().second == 'D');
  541. assert(queue2->dequeue().second == 'D');
  542. assert(queue2->dequeue().second == 'C');
  543. assert(queue3->dequeue().second == 'C');
  544. assert(queue3->dequeue().second == 'D');
  545. assert(queue4->dequeue().second == 'D');
  546. assert(queue4->dequeue().second == 'C');
  547. delete queue1;
  548. delete queue2;
  549. delete queue3;
  550. delete queue4;
  551. //===============================================
  552. BST.remove(4);
  553. assert(BST.getSize() == 1);
  554. queue1 = BST.getPostOrder();
  555. queue2 = BST.getPreOrder();
  556. queue3 = BST.getInOrder();
  557. queue4 = BST.getLevelOrder();
  558. assert(queue1->dequeue().second == 'C');
  559. assert(queue2->dequeue().second == 'C');
  560. assert(queue3->dequeue().second == 'C');
  561. assert(queue4->dequeue().second == 'C');
  562. delete queue1;
  563. delete queue2;
  564. delete queue3;
  565. delete queue4;
  566. //===============================================
  567. BST.remove(3);
  568. assert(BST.getSize() == 0);
  569. queue1 = BST.getPostOrder();
  570. queue2 = BST.getPreOrder();
  571. queue3 = BST.getInOrder();
  572. queue4 = BST.getLevelOrder();
  573. assert(queue1->getSize() == 0);
  574. assert(queue2->getSize() == 0);
  575. assert(queue3->getSize() == 0);
  576. assert(queue4->getSize() == 0);
  577. delete queue1;
  578. delete queue2;
  579. delete queue3;
  580. delete queue4;
  581. }
  582. /* testgetHeight - accomplishes the following
  583. *
  584. * *tests that empty tree yields height of -1
  585. *
  586. * *tests that tree with one element returns height of 0
  587. *
  588. * *tests height by creating tree and incrementally
  589. * removing nodes
  590. */
  591. void testgetHeight(){
  592. SplayTree<int, char> BST;
  593. BST.insert(4, 'D');
  594. BST.insert(2, 'B');
  595. BST.insert(1, 'A');
  596. BST.insert(3, 'C');
  597. BST.insert(6, 'F');
  598. BST.insert(5, 'E');
  599. BST.insert(7, 'G');
  600. for (int i = 1; i <= 7; i++) {
  601. assert(BST.getHeight() == 7-i);
  602. BST.remove(i);
  603. }
  604. assert(BST.getHeight() == -1);
  605. }
  606. /* testMaxMin - accomplishes the following
  607. *
  608. * *tests that calling getMax or getMin on empty tree
  609. * results in error thrown
  610. *
  611. * *tests that tree with one element returns same max
  612. * and min key
  613. *
  614. * *tests max and min by creating tree and incrementally
  615. * removing nodes
  616. */
  617. void testMaxMin(){
  618. SplayTree<int, char> BST;
  619. try{
  620. BST.getMax();
  621. assert(false);
  622. } catch(runtime_error& exc){}
  623. try{
  624. BST.getMin();
  625. assert(false);
  626. } catch(runtime_error& exc){}
  627. BST.insert(6, 'A');
  628. assert(BST.getMax() == 6);
  629. assert(BST.getMin() == 6);
  630. assert(BST.getMax() == BST.getMin());
  631. BST.insert(1, 'B');
  632. BST.insert(5, 'C');
  633. BST.insert(2, 'D');
  634. BST.insert(4, 'E');
  635. BST.insert(3, 'F');
  636. BST.insert(11, 'G');
  637. BST.insert(7, 'H');
  638. BST.insert(10, 'I');
  639. BST.insert(8, 'J');
  640. BST.insert(9, 'K');
  641. assert(BST.getMax() == 11);
  642. assert(BST.getMin() == 1);
  643. BST.remove(11);
  644. BST.remove(1);
  645. assert(BST.getMax() == 10);
  646. assert(BST.getMin() == 2);
  647. BST.remove(10);
  648. BST.remove(2);
  649. assert(BST.getMax() == 9);
  650. assert(BST.getMin() == 3);
  651. BST.remove(9);
  652. BST.remove(3);
  653. assert(BST.getMax() == 8);
  654. assert(BST.getMin() == 4);
  655. BST.remove(8);
  656. BST.remove(4);
  657. assert(BST.getMax() == 7);
  658. assert(BST.getMin() == 5);
  659. BST.remove(7);
  660. BST.remove(5);
  661. assert(BST.getMax() == 6);
  662. assert(BST.getMin() == 6);
  663. assert(BST.getMax() == BST.getMin());
  664. }