YauhenMardan

Untitled

Feb 27th, 2019
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.99 KB | None | 0 0
  1. #include <fstream>
  2. #include <set>
  3.  
  4. class BinarySearchTree{
  5. private:
  6. //fields
  7. struct Node{
  8. //fields
  9. long long value;
  10. Node* left;
  11. Node* right;
  12. Node* parent;
  13. long long height;
  14. long long depth;
  15. //constructor
  16. Node(long long value, Node* parent){
  17. this->value=value;
  18. left=NULL;
  19. right=NULL;
  20. this->parent=parent;
  21. }
  22. //destructor
  23. //?
  24. };
  25. Node* root;
  26. //methods
  27. void freeMemory(Node*& node){
  28. if(node!=NULL){
  29. freeMemory(node->left);
  30. freeMemory(node->right);
  31. delete node;
  32. }
  33. }
  34. bool find(Node* node,long long value){
  35. if(node==NULL){
  36. return false;
  37. } else {
  38. if(node->value==value){
  39. return true;
  40. }
  41. else if(node->value > value){
  42. return find(node->left, value);
  43. }
  44. else {
  45. return find(node->right, value);
  46. }
  47. }
  48. }
  49. void writePreOrder(Node* node,std::ofstream &fout){
  50. if(node!=NULL){
  51. fout<<node->value<<"\n";
  52. writePreOrder(node->left, fout);
  53. writePreOrder(node->right, fout);
  54. }
  55. }
  56. long long getMinValue(Node* node){
  57. long long minValue=node->value;
  58. while (node->left!=NULL) {
  59. minValue=node->left->value;
  60. node=node->left;
  61. }
  62. return minValue;
  63. }
  64. void deleteNode(Node*& node,long long value){
  65. if(node==NULL){
  66.  
  67. }else if(node->value > value){
  68. deleteNode(node->left, value);
  69. } else if(node->value < value){
  70. deleteNode(node->right, value);
  71. } else{
  72. if(node->left==NULL){
  73. Node* tempNode = node->right;
  74. delete node;
  75. node=tempNode;
  76. }else if(node->right==NULL){
  77. Node*tempNode = node->left;
  78. delete node;
  79. node=tempNode;
  80. }else{
  81. node->value=getMinValue(node->right);
  82. deleteNode(node->right, node->value);
  83. }
  84. }
  85. }
  86. long long countHeight(Node* node){
  87. if(node==NULL){
  88. return -1;
  89. }
  90. node->height=max(countHeight(node->left),countHeight(node->right))+1;
  91. return node->height;
  92. }
  93. void countDepth(Node* node){
  94. if(node!=NULL){
  95. if(node->parent==NULL){
  96. node->depth=0;
  97. } else{
  98. node->depth=node->parent->depth+1;
  99. }
  100. countDepth(node->left);
  101. countDepth(node->right);
  102. }
  103. }
  104. long long max(long long a, long long b){
  105. return a>b ? a : b;
  106. }
  107. long long max(long long a, long long b, long long c){
  108. return a>b ? a : b;
  109. }
  110. long long getMaxHalfWay(Node* node){
  111. long long distU=maxDist(node);
  112. if(node->left==NULL && node->right==NULL){
  113. return distU;
  114. } else if(node->left==NULL){
  115. return distU+node->right->height+1;
  116. } else if(node->right==NULL){
  117. return distU+node->left->height+1;
  118. } else{
  119. return max(distU+node->right->height +1,
  120. distU+node->left->height +1,
  121. node->right->height + node->left->height+2);
  122. }
  123. }
  124. long long maxDist(Node* node){
  125. Node* parent=node->parent;
  126. Node* u=node;
  127. long long distU=0;
  128. long long maxDist=-1, currDist=-1;
  129. do {
  130. distU++;
  131. if(u->value < parent->value){
  132. if(parent->right!=NULL){
  133. currDist=distU+parent->right->height+1;
  134. }
  135. } else if(u->value > parent->value){
  136. if(parent->left!=NULL){
  137. currDist=distU+parent->left->height+1;
  138. }
  139. }
  140. u=parent;
  141. parent=u->parent;
  142. maxDist=max(maxDist,currDist);
  143. } while (parent!=NULL);
  144. return maxDist;
  145. }
  146. Node* getNode(Node* node,long long value){
  147. if(node==NULL || node->value==value){
  148. return node;
  149. }else if(value<node->value){
  150. return getNode(node->left, value);
  151. }else{
  152. return getNode(node->right, value);
  153. }
  154. }
  155. std::set<long long> getDistToLeafsSet(Node* node){
  156. std::set<long long> distSet;
  157. postOder(node, distSet, node->depth);
  158. return distSet;
  159. }
  160. void postOder(Node* node,std::set<long long>& distSet, long long depth){
  161. if(node!=NULL){
  162. postOder(node->left, distSet, depth);
  163. postOder(node->right, distSet, depth);
  164. if(node->left==NULL && node->right==NULL){
  165. distSet.insert(node->depth-depth);
  166. }
  167. }
  168. }
  169. public:
  170. //constructors
  171. BinarySearchTree(){
  172. root=NULL;
  173. }
  174. BinarySearchTree(long long value){
  175. root=new Node(value, NULL);
  176. }
  177. //destructor
  178. ~BinarySearchTree(){
  179. freeMemory(root);
  180. }
  181. //methods
  182. void addNode(long long value){
  183. if(root==NULL){
  184. root=new Node(value,NULL);
  185. return;
  186. }
  187. Node* parent=NULL;
  188. Node* u=root;
  189. while (u!=NULL) {
  190. parent=u;
  191. if(value<u->value){
  192. u=u->left;
  193. }else if(value>u->value){
  194. u=u->right;
  195. } else{
  196. return;
  197. }
  198. }
  199. if(value<parent->value){
  200. parent->left=new Node(value,parent);
  201. } else if(value>parent->value){
  202. parent->right=new Node(value,parent);
  203. }
  204. }
  205. void writePreOrder(std::ofstream& fout){
  206. writePreOrder(root, fout);
  207. }
  208. bool find(long long value){
  209. return find(root, value);
  210. }
  211. void deleteNode(long long value){
  212. deleteNode(root, value);
  213. }
  214. void countHeight(){
  215. countHeight(root);
  216. }
  217. void countDepth(){
  218. countDepth(root);
  219. }
  220. long long getHeight(){
  221. return root->height;
  222. }
  223. long long getMaxHalfWay(long long value){
  224. return getMaxHalfWay(getNode(root,value));
  225. }
  226. std::set<long long> getDistToLeafsSet(long long value){
  227. return getDistToLeafsSet(getNode(root, value));
  228. }
  229. };
  230.  
  231. int main(int argc, const char * argv[]) {
  232. std::ifstream fin("input.txt");
  233. std::ofstream fout("output.txt");
  234. BinarySearchTree* tree= new BinarySearchTree();
  235. long long value;
  236. while ( (fin>>value) ){
  237. tree->addNode(value);
  238. }
  239. tree->countHeight();
  240. tree->countDepth();
  241. fout<<tree->getHeight()<<std::endl;
  242. fout<<tree->getMaxHalfWay(25)<<std::endl;
  243. //tree->writePreOrder(fout);
  244. auto SSS=tree->getDistToLeafsSet(10);
  245. delete tree;
  246. return 0;
  247. }
Advertisement
Add Comment
Please, Sign In to add comment