testSplay.cpp 21 KB

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