SplayTree-inl.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. /* SplayTree-inl.h
  2. * Tahmid Rahman
  3. * Dylan Jeffers
  4. *
  5. * Splay Tree implementation
  6. */
  7. #include <stdexcept>
  8. #include "library/arrayQueue.h"
  9. /*SplayTreeNode implmentation */
  10. //default constructor
  11. template <typename K, typename V>
  12. SplayTreeNode<K,V>::SplayTreeNode() {
  13. left = NULL;
  14. right = NULL;
  15. }
  16. // standard constructor
  17. template <typename K, typename V>
  18. SplayTreeNode<K,V>::SplayTreeNode(K k, V v) {
  19. key = k;
  20. value = v;
  21. left = NULL;
  22. right = NULL;
  23. }
  24. /*SplayTree Implemenation */
  25. //standard constructor
  26. template <typename K, typename V>
  27. SplayTree<K,V>::SplayTree() {
  28. size = 0;
  29. root = NULL;
  30. }
  31. template <typename K, typename V>
  32. SplayTree<K,V>::~SplayTree() {
  33. traverseAndDelete(root);
  34. }
  35. template <typename K, typename V>
  36. int SplayTree<K,V>::getSize() {
  37. return size;
  38. }
  39. template <typename K, typename V>
  40. bool SplayTree<K,V>::isEmpty() {
  41. return size == 0;
  42. }
  43. template <typename K, typename V>
  44. K SplayTree<K,V>::getMax() {
  45. if (isEmpty()) {
  46. throw std::runtime_error("SplayTree::getMax called on an empty tree.");
  47. }
  48. return getMaxInSubtree(root);
  49. }
  50. template <typename K, typename V>
  51. K SplayTree<K,V>::getMin() {
  52. if (isEmpty()) {
  53. throw std::runtime_error("SplayTree::getMin called on an empty tree.");
  54. }
  55. return getMinInSubtree(root);
  56. }
  57. template <typename K, typename V>
  58. int SplayTree<K,V>::getHeight() {
  59. return getHeightOfSubtree(root);
  60. }
  61. template <typename K, typename V>
  62. void SplayTree<K,V>::insert(K key, V value) {
  63. bool inserted = false;
  64. bool skip = false;
  65. root = insertInSubtree(root, key, value, &inserted, &skip);
  66. }
  67. template <typename K, typename V>
  68. void SplayTree<K,V>::update(K key, V value) {
  69. //updateInSubtree(root, key, value);
  70. if (contains(key)){
  71. root->value = value;
  72. }
  73. else{
  74. throw std::runtime_error("SplayTree:update called on nonexistent node");
  75. }
  76. }
  77. template <typename K, typename V>
  78. bool SplayTree<K,V>::contains(K key) {
  79. bool skip = false;
  80. return containsInSubtree(root, key, &skip);
  81. }
  82. template <typename K, typename V>
  83. void SplayTree<K,V>::remove(K key) {
  84. root = removeFromSubtree(root, key);
  85. }
  86. template <typename K, typename V>
  87. V SplayTree<K,V>::find(K key) {
  88. if (contains(key)){
  89. return root->value;
  90. }
  91. else{
  92. throw std::runtime_error("SplayTree:find called on nonexistent node");
  93. }
  94. }
  95. template <typename K, typename V>
  96. Queue< Pair<K,V> >* SplayTree<K,V>::getPreOrder() {
  97. Queue< Pair<K,V> >* it = new ArrayQueue< Pair<K,V> >();
  98. buildPreOrder(root, it);
  99. return it;
  100. }
  101. template <typename K, typename V>
  102. Queue< Pair<K,V> >* SplayTree<K,V>::getInOrder() {
  103. Queue< Pair<K,V> >* it = new ArrayQueue< Pair<K,V> >();
  104. buildInOrder(root, it);
  105. return it;
  106. }
  107. template <typename K, typename V>
  108. Queue< Pair<K,V> >* SplayTree<K,V>::getPostOrder() {
  109. Queue< Pair<K,V> >* it = new ArrayQueue< Pair<K,V> >();
  110. buildPostOrder(root, it);
  111. return it;
  112. }
  113. template <typename K, typename V>
  114. Queue< Pair<K,V> >* SplayTree<K,V>::getLevelOrder() {
  115. ArrayQueue< SplayTreeNode<K,V>* > levelQ;
  116. Queue< Pair<K,V> >* it = new ArrayQueue< Pair<K,V> >();
  117. levelQ.enqueue(root);
  118. while (!levelQ.isEmpty()) {
  119. SplayTreeNode<K,V>* current = levelQ.dequeue();
  120. if (current != NULL) {
  121. it->enqueue( Pair<K,V>(current->key, current->value) );
  122. levelQ.enqueue(current->left);
  123. levelQ.enqueue(current->right);
  124. }
  125. }
  126. return it;
  127. }
  128. template <typename K, typename V>
  129. K SplayTree<K,V>::getRootKey() {
  130. return root->key;
  131. }