YauhenMardan

Untitled

Jun 1st, 2019
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.92 KB | None | 0 0
  1. #include <fstream>
  2. #include <vector>
  3.  
  4. class BinarySearchTree{
  5. private:
  6. //fields
  7. struct Node{
  8. //fields
  9. long long value;
  10. long long height;
  11. long long depth;
  12. Node* left;
  13. Node* right;
  14. Node* parent;
  15. //constructor
  16. Node(long long value, Node* parent){
  17. this->value=value;
  18. this->height=0;
  19. this->depth=0;
  20. left=NULL;
  21. right=NULL;
  22. this->parent=parent;
  23. }
  24. //destructor
  25. //?
  26. };
  27. Node* root;
  28. std::vector<Node*> nodes;
  29. long long maxHalfWay;
  30. //methods
  31. void freeMemory(Node*& node){
  32. if(node!=NULL){
  33. freeMemory(node->left);
  34. freeMemory(node->right);
  35. delete node;
  36. }
  37. }
  38. bool find(Node* node,long long value){
  39. if(node==NULL){
  40. return false;
  41. } else {
  42. if(node->value==value){
  43. return true;
  44. }
  45. else if(node->value > value){
  46. return find(node->left, value);
  47. }
  48. else {
  49. return find(node->right, value);
  50. }
  51. }
  52. }
  53. void writePreOrder(Node* node,std::ofstream &fout){
  54. if(node!=NULL){
  55. fout<<node->value<<" "<<node->height<<" "<<node->depth<<"\n";
  56. writePreOrder(node->left, fout);
  57. writePreOrder(node->right, fout);
  58. }
  59. }
  60. // void traverse(Node* node){
  61. // if(node!=NULL){
  62. //
  63. // traverse(node->left);
  64. // traverse(node->right);
  65. // }
  66. // }
  67. long long getMinValue(Node* node){
  68. long long minValue=node->value;
  69. while (node->left!=NULL) {
  70. minValue=node->left->value;
  71. node=node->left;
  72. }
  73. return minValue;
  74. }
  75. void deleteNode(Node*& node,long long value){
  76. if(node==NULL){
  77.  
  78. }else if(node->value > value){
  79. deleteNode(node->left, value);
  80. } else if(node->value < value){
  81. deleteNode(node->right, value);
  82. } else{
  83. if(node->left==NULL){
  84. Node* tempNode = node->right;
  85. delete node;
  86. node=tempNode;
  87. }else if(node->right==NULL){
  88. Node*tempNode = node->left;
  89. delete node;
  90. node=tempNode;
  91. }else{
  92. node->value=getMinValue(node->right);
  93. deleteNode(node->right, node->value);
  94. }
  95. }
  96. }
  97. long long countHeight(Node* node){
  98. if(node==NULL){
  99. return -1;
  100. }
  101. node->height=max(countHeight(node->left),countHeight(node->right))+1;
  102. return node->height;
  103. }
  104. void countDepth(Node* node){
  105. if(node!=NULL){
  106. if(node->parent==NULL){
  107. node->depth=0;
  108. } else{
  109. node->depth=node->parent->depth+1;
  110. }
  111. countDepth(node->left);
  112. countDepth(node->right);
  113. }
  114. }
  115. long long max(long long a,long long b){
  116. return a>b ? a : b;
  117. }
  118. public:
  119. //solve
  120. void solve(){
  121.  
  122. }
  123. //constructors
  124. BinarySearchTree(){
  125. root=NULL;
  126. }
  127. BinarySearchTree(int value){
  128. root=new Node(value,NULL);
  129. }
  130. //destructor
  131. ~BinarySearchTree(){
  132. freeMemory(root);
  133. }
  134. //methods
  135. void addNode(long long value){
  136. if(root==NULL){
  137. root=new Node(value,NULL);
  138. return;
  139. }
  140. Node* parent=NULL;
  141. Node* u=root;
  142. while (u!=NULL) {
  143. parent=u;
  144. if(value<u->value){
  145. u=u->left;
  146. }else if(value>u->value){
  147. u=u->right;
  148. } else{
  149. return;
  150. }
  151. }
  152. if(value<parent->value){
  153. parent->left=new Node(value,parent);
  154. } else if(value>parent->value){
  155. parent->right=new Node(value,parent);
  156. }
  157. }
  158. void writePreOrder(std::ofstream& fout){
  159. writePreOrder(root, fout);
  160. }
  161. bool find(long long value){
  162. return find(root, value);
  163. }
  164. void deleteNode(long long value){
  165. deleteNode(root, value);
  166. }
  167. void countHeight(){
  168. countHeight(root);
  169. }
  170. void countDepth(){
  171. countDepth(root);
  172. }
  173. };
  174.  
  175. int main(int argc, const char * argv[]) {
  176. std::ifstream fin("input.txt");
  177. std::ofstream fout("output.txt");
  178. BinarySearchTree* tree= new BinarySearchTree();
  179. long long value;
  180. while ( (fin>>value) )
  181. {
  182. if(!tree->find(value)){
  183. tree->addNode(value);
  184. }
  185. }
  186. tree->countHeight();
  187. tree->countDepth();
  188. tree->solve();
  189. // tree->deleteNode(valueToDelete);
  190. tree->writePreOrder(fout);
  191. delete tree;
  192. return 0;
  193. }
Advertisement
Add Comment
Please, Sign In to add comment