SplayTree-inl.h 3.3 KB

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