Guest User

Untitled

a guest
Jul 15th, 2018
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.67 KB | None | 0 0
  1. ## tree & node templates
  2.  
  3. #ifndef __TREE_H__
  4. #define __TREE_H__
  5.  
  6. template <class T> class TreeNode {
  7. private:
  8. T *item;
  9. TreeNode<T> *parent_ptr, *left_ptr, *right_ptr;
  10. public:
  11. TreeNode() { parent_ptr = left_ptr = right_ptr = 0; };
  12. TreeNode(const T & it) { item = new T(it); parent_ptr = left_ptr = right_ptr = 0; };
  13. ~TreeNode() { delete item; };
  14.  
  15. void set_parent(TreeNode<T> *parent) { parent_ptr = parent; };
  16. void set_left(TreeNode<T> *left) { left_ptr = left; };
  17. void set_right(TreeNode<T> *right) { right_ptr = right; };
  18. T & value() { return *item; };
  19.  
  20. TreeNode<T> * parent() { return parent_ptr; };
  21. TreeNode<T> * left() { return left_ptr; };
  22. TreeNode<T> * right() { return right_ptr; };
  23. };
  24.  
  25. template <class T> class Tree {
  26. protected:
  27. TreeNode<T> *root_ptr;
  28. typedef enum { null, to_the_left, to_the_right } direction;
  29.  
  30. public:
  31. Tree() {
  32. root_ptr = 0;
  33. };
  34.  
  35. Tree(const T & item) {
  36. insert(item);
  37. };
  38.  
  39. Tree(const T items[], int num_items) {
  40. root_ptr = 0;
  41.  
  42. for (int i = 0; i < num_items; i++) {
  43. insert(items[i]);
  44. }
  45. };
  46.  
  47. TreeNode<T> * root() const {
  48. return root_ptr;
  49. };
  50.  
  51. TreeNode<T> * operator<<(const T & item) {
  52. return insert(item);
  53. }
  54.  
  55. TreeNode<T> * insert(const T & item) {
  56. TreeNode<T> *prev, *search = root_ptr;
  57. direction taken = null;
  58.  
  59. while (search) {
  60. prev = search;
  61.  
  62. if (item > search->value()) {
  63. search = search->right();
  64. taken = to_the_right;
  65. } else {
  66. search = search->left();
  67. taken = to_the_left;
  68. }
  69. }
  70.  
  71. TreeNode<T> *new_leaf = new TreeNode<T>(item);
  72.  
  73. if (taken == null) {
  74. root_ptr = new_leaf;
  75. } else if (taken == to_the_right) {
  76. prev->set_right(new_leaf);
  77. new_leaf->set_parent(prev);
  78. } else {
  79. prev->set_left(new_leaf);
  80. new_leaf->set_parent(prev);
  81. }
  82.  
  83. return new_leaf;
  84. };
  85.  
  86. // return a pointer to the TreeNode containing an item that compares as equal with the argument item
  87. TreeNode<T> * find(T & item) const {
  88. TreeNode<T> * search = root_ptr;
  89.  
  90. while (search && search->value() != item) {
  91. if(item > search->value()) {
  92. search = search -> right();
  93. } else {
  94. search = search -> left();
  95. }
  96. }
  97.  
  98. return search;
  99. };
  100.  
  101. typedef void (*node_visitor_function)(TreeNode<T> *);
  102.  
  103. void visit_in_order(node_visitor_function visitor)
  104. {
  105. perform_visit_in_order(visitor, root_ptr);
  106. }
  107.  
  108. void perform_visit_in_order(node_visitor_function visitor, TreeNode<T> * node)
  109. {
  110. if (node) {
  111. visit_in_order(visitor, node->left());
  112. visitor(node);
  113. visit_in_order(visitor, node->right());
  114. }
  115. }
  116. };
  117.  
  118. #endif
  119.  
  120. ## simple test code
  121.  
  122. #include "../tree.h"
  123. #include "../string.h"
  124. #include "../deck.h"
  125. #include "../card.h"
  126. #include "test_macros.h"
  127.  
  128. #include <iostream>
  129. using std::cout;
  130. using std::endl;
  131.  
  132. String convenient;
  133.  
  134. void test_with_ints();
  135. void int_tree_visitor(TreeNode<int> *node);
  136.  
  137. typedef Tree<int> IntTree;
  138. typedef TreeNode<int> IntNode;
  139.  
  140. int main(void)
  141. {
  142. test_with_ints();
  143. }
  144.  
  145. void test_with_ints()
  146. {
  147. IntTree int_tree;
  148.  
  149. int_tree << 3;
  150. int_tree << -2;
  151. int_tree << 5;
  152.  
  153. assert_equal(int_tree.root()->value(), 3, "Test root value");
  154. assert_equal(int_tree.root()->left()->value(), -2, "Test left value");
  155. assert_equal(int_tree.root()->right()->value(), 5, "Test right value");
  156.  
  157. convenient = "";
  158. int_tree.visit_in_order(&int_tree_visitor);
  159. assert_equal("3 -2 5", convenient, "Test in-order-visit");
  160. }
  161.  
  162. void int_tree_visitor(IntNode *node)
  163. {
  164. convenient += " " + node->value();
  165. }
  166.  
  167. ## compiler output [plain_text]
  168.  
  169. make tree-test
  170. make: Circular list.h <- list.h dependency dropped.
  171. make: Circular list.h <- tree.h dependency dropped.
  172. make: Circular tree.h <- tree.h dependency dropped.
  173. g++ -Wall -g test/test_tree.cpp card.cpp deck.cpp string.cpp hand.cpp hand_collection.cpp game.cpp list.h tree.h player.cpp round.cpp && ./a.out
  174. In file included from test/test_tree.cpp:15:
  175. test/test_macros.h:12:1: warning: "assert" redefined
  176. In file included from /usr/include/c++/4.0.0/cassert:48,
  177. from /usr/include/c++/4.0.0/debug/debug.h:272,
  178. from /usr/include/c++/4.0.0/bits/stl_algobase.h:76,
  179. from /usr/include/c++/4.0.0/bits/char_traits.h:46,
  180. from /usr/include/c++/4.0.0/ios:45,
  181. from /usr/include/c++/4.0.0/ostream:44,
  182. from /usr/include/c++/4.0.0/iostream:44,
  183. from test/../string.h:13,
  184. from test/test_tree.cpp:12:
  185. /usr/include/assert.h:84:1: warning: this is the location of the previous definition
  186. tree.h: In member function ‘void Tree<T>::perform_visit_in_order(void (*)(TreeNode<T>*), TreeNode<T>*) [with T = int]’:
  187. tree.h:112: instantiated from ‘void Tree<T>::visit_in_order(void (*)(TreeNode<T>*)) [with T = int]’
  188. test/test_tree.cpp:47: instantiated from here
  189. tree.h:118: error: no matching function for call to ‘Tree<int>::visit_in_order(void (*)(TreeNode<int>*), TreeNode<int>*)’
  190. tree.h:110: note: candidates are: void Tree<T>::visit_in_order(void (*)(TreeNode<T>*)) [with T = int]
  191. tree.h:120: error: no matching function for call to ‘Tree<int>::visit_in_order(void (*)(TreeNode<int>*), TreeNode<int>*)’
  192. tree.h:110: note: candidates are: void Tree<T>::visit_in_order(void (*)(TreeNode<T>*)) [with T = int]
  193. make: *** [tree-test] Error 1
Add Comment
Please, Sign In to add comment