Advertisement
Guest User

Untitled

a guest
Jul 28th, 2015
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.14 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. template <class T>
  4. class Tree{
  5. private:
  6. struct TreeNode{
  7. T data;
  8. TreeNode *left;
  9. TreeNode *right;
  10.  
  11. TreeNode(T val):data(val),left(NULL),right(NULL){}
  12. //~TreeNode(){
  13. // delete left;
  14. // delete right;
  15. //}
  16. };
  17.  
  18. TreeNode *root;
  19. void printHelper(TreeNode *)const;
  20. void insertHelper(T data, TreeNode *leaf);
  21. void DeleteHelper(T data, TreeNode* &);
  22. void DeleteNode(TreeNode* &);
  23. bool searchElementHelper(T key, TreeNode *leaf);
  24. void copyTree(TreeNode *&thisRoot, TreeNode *rhsRoot);
  25. TreeNode* findSmallest(TreeNode *,TreeNode *&);
  26. public:
  27. Tree();
  28. ~Tree();
  29. Tree(const Tree& rhs);
  30. const Tree& operator=(const Tree& rhs);
  31. void insert(T);
  32. void Delete(T);
  33. void print()const;
  34. bool searchElement(T _data);
  35. };
  36.  
  37. template<class T>
  38. Tree<T>::Tree():root(NULL){}
  39.  
  40. template<class T>
  41. Tree<T>::Tree(const Tree& rhs){
  42. if(rhs.root==NULL)
  43. root=NULL;
  44. else
  45. copyTree(root,rhs.root);
  46. }
  47.  
  48. template<class T>
  49. void Tree<T>::copyTree(TreeNode *&thisRoot,TreeNode *rhsRoot){
  50. if(rhsRoot==NULL)
  51. thisRoot=NULL;
  52. else{
  53. thisRoot = new TreeNode(rhsRoot->data);
  54. copyTree(thisRoot->left,rhsRoot->left);
  55. copyTree(thisRoot->right,rhsRoot->right);
  56. }
  57. }
  58.  
  59. template<class T>
  60. const Tree<T>& Tree<T>::operator=(const Tree& rhs){
  61. if(this!=&rhs){
  62. copyTree(this->root,rhs.root);
  63. }
  64. return *this;
  65. }
  66.  
  67. template<class T>
  68. Tree<T>::~Tree(){
  69. delete root;
  70. }
  71.  
  72. template<class T>
  73. void Tree<T>::insert(T _data){
  74. if(root==NULL)
  75. root = new TreeNode(_data);
  76. else{
  77. insertHelper(_data, root);
  78. }
  79. }
  80.  
  81. template<class T>
  82. void Tree<T>::insertHelper(T data, TreeNode *leaf){
  83. if(data < leaf->data){
  84. if(leaf->left == NULL){
  85. TreeNode *newNode = new TreeNode(data);
  86. leaf->left = newNode;
  87. }else
  88. insertHelper(data,leaf->left);
  89. }else if(data > leaf->data){
  90. if(leaf->right==NULL){
  91. TreeNode *newNode = new TreeNode(data);
  92. leaf->right = newNode;
  93. return;
  94. }
  95. insertHelper(data,leaf->right);
  96. }else{
  97. std::cout << "The data already exist" << std::endl;
  98. }
  99. }
  100.  
  101. template<class T>
  102. void Tree<T>::Delete(T _data){
  103. if(root==NULL){
  104. std::cout <<"The Tree is emptyn";
  105. return;
  106. }
  107. DeleteHelper(_data,root);
  108. }
  109. template<class T>
  110. void Tree<T>::DeleteHelper(T _data,TreeNode* &rootRef){
  111. if(rootRef==NULL)
  112. return;
  113. if(_data==rootRef->data)
  114. DeleteNode(rootRef);
  115. else if(_data < rootRef->data)
  116. DeleteHelper(_data,rootRef->left);
  117. else if(_data > rootRef->data)
  118. DeleteHelper(_data,rootRef->right);
  119. }
  120. template<class T>
  121. void Tree<T>::DeleteNode(TreeNode* &rootRef){
  122. // The current node has no children
  123. TreeNode* temp = rootRef;
  124. if(rootRef->left==NULL && rootRef->right==NULL)
  125. rootRef = NULL;
  126. else if(rootRef->left==NULL && rootRef->right!=NULL)
  127. rootRef = rootRef->right;
  128. else if(rootRef->left!=NULL && rootRef->right==NULL)
  129. rootRef = rootRef->left;
  130. else{ //current node has two childreen
  131. //find the smallest element in the right subtree
  132. TreeNode* parent = rootRef;
  133. temp = rootRef->right;
  134. temp = findSmallest(temp,parent);
  135. rootRef->data = temp->data;
  136. if(parent==rootRef)
  137. parent->right = temp->right;
  138. else
  139. parent->left = temp->left;
  140. }
  141. delete temp;
  142. }
  143.  
  144. template<class T>
  145. typename Tree<T>::TreeNode* Tree<T>::findSmallest(TreeNode *root, TreeNode *&parent){
  146. if(root->left==nullptr)
  147. return root;
  148. std::cout << "ASda" << root->data << std::endl;
  149. return findSmallest(root->left,root);
  150. }
  151. template<class T>
  152. void Tree<T>::print()const{
  153. if(root==NULL)
  154. std::cout << "The Tree has no element" << std::endl;
  155. else
  156. printHelper(root);
  157. }
  158.  
  159. template<class T>
  160. void Tree<T>::printHelper(TreeNode *root)const{
  161. if(root==NULL)
  162. return;
  163. printHelper(root->left);
  164. std::cout << root->data << " " << std::endl;
  165. printHelper(root->right);
  166. }
  167.  
  168. template<class T>
  169. bool Tree<T>::searchElement(T _data){
  170. return searchElementHelper(_data,root);
  171. }
  172.  
  173. template<class T>
  174. bool Tree<T>::searchElementHelper(T _data,TreeNode *rootRef){
  175. if(rootRef==NULL)
  176. return false;
  177. if(_data==rootRef->data)
  178. return true;
  179. if(_data < rootRef->data)
  180. return searchElementHelper(_data,rootRef->left);
  181. if(_data > rootRef->data)
  182. return searchElementHelper(_data,rootRef->right);
  183. return false;
  184. }
  185. int main(int argc, const char * argv[]) {
  186. Tree<int> tree;
  187. tree.insert(12);
  188. tree.insert(10);
  189. tree.insert(19);
  190. tree.insert(11);
  191. tree.insert(16);
  192. tree.insert(13);
  193. tree.insert(15);
  194. tree.insert(14);
  195. tree.Delete(16);
  196. if(tree.searchElement(16))
  197. std::cout << "Found" << std::endl;
  198. else
  199. std::cout << "NOT Found" << std::endl;
  200. tree.print();
  201. Tree<int> tree2 = tree;
  202. std::cout<<"The elements of Tree 2: n";
  203. tree2.print();
  204.  
  205. Tree<int> tree3;
  206. tree3 = tree2;
  207. std::cout <<"The elements of Tree 3: n";
  208. tree3.print();
  209. return 0;
  210. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement