YauhenMardan

Untitled

Apr 11th, 2019
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.09 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. long long m1=max(a,b);
  109. long long m2=max(b,c);
  110. return max(m1,m2);
  111. }
  112. long long getMaxHalfWay(Node* node){
  113. long long distU=maxDist(node);
  114. if(node->left==NULL && node->right==NULL){
  115. return distU;
  116. } else if(node->left==NULL){
  117. return distU+node->right->height+1;
  118. } else if(node->right==NULL){
  119. return distU+node->left->height+1;
  120. } else{
  121. return max(distU+node->right->height +1,
  122. distU+node->left->height +1,
  123. node->right->height + node->left->height+2);
  124. }
  125. }
  126. long long maxDist(Node* node){
  127. Node* parent=node->parent;
  128. Node* u=node;
  129. long long distU=0;
  130. long long maxDist=-1, currDist=-1;
  131. do {
  132. distU++;
  133. if(u->value < parent->value){
  134. if(parent->right!=NULL){
  135. currDist=distU+parent->right->height+1;
  136. }
  137. } else if(u->value > parent->value){
  138. if(parent->left!=NULL){
  139. currDist=distU+parent->left->height+1;
  140. }
  141. }
  142. u=parent;
  143. parent=u->parent;
  144. maxDist=max(maxDist,currDist);
  145. } while (parent!=NULL);
  146. return maxDist;
  147. }
  148. Node* getNode(Node* node,long long value){
  149. if(node==NULL || node->value==value){
  150. return node;
  151. }else if(value<node->value){
  152. return getNode(node->left, value);
  153. }else{
  154. return getNode(node->right, value);
  155. }
  156. }
  157. std::set<long long> getDistToLeafsSetDown(Node* node){
  158. std::set<long long> distSet;
  159. postOder(node, distSet, node->depth);
  160. return distSet;
  161. }
  162. void postOder(Node* node,std::set<long long>& distSet, long long depth){
  163. if(node!=NULL){
  164. postOder(node->left, distSet, depth);
  165. postOder(node->right, distSet, depth);
  166. if(node->left==NULL && node->right==NULL){
  167. distSet.insert(node->depth-depth);
  168. }
  169. }
  170. }
  171. std::set<long long> getDistToLeafsSetUp(Node* node){
  172. std::set<long long> distSet;
  173. std::set<long long> tempDistSet1,tempDistSet2;
  174. long long distU=0;
  175. Node* parent=node->parent;
  176. Node* u=node;
  177. do {
  178. distU++;
  179. std::set<long long> tempDistSet;
  180. if(u->value < parent->value){
  181. if(parent->right!=NULL){
  182. tempDistSet= getDistToLeafsSetDown(parent->right);
  183. }
  184. } else if(u->value > parent->value){
  185. if(parent->left!=NULL){
  186. tempDistSet= getDistToLeafsSetDown(parent->left);
  187. }
  188. }
  189. // std::transform(tempDistSet.begin(),
  190. // tempDistSet.end(),
  191. // tempDistSet.begin(),
  192. // [distU](long long a){return a+distU;});
  193. distSet.insert(tempDistSet.begin(), tempDistSet.end());
  194. u=parent;
  195. parent=u->parent;
  196. } while(parent!=NULL);
  197. return distSet;
  198. }
  199. public:
  200. //constructors
  201. BinarySearchTree(){
  202. root=NULL;
  203. }
  204. BinarySearchTree(long long value){
  205. root=new Node(value, NULL);
  206. }
  207. //destructor
  208. ~BinarySearchTree(){
  209. freeMemory(root);
  210. }
  211. //methods
  212. void addNode(long long value){
  213. if(root==NULL){
  214. root=new Node(value,NULL);
  215. return;
  216. }
  217. Node* parent=NULL;
  218. Node* u=root;
  219. while (u!=NULL) {
  220. parent=u;
  221. if(value<u->value){
  222. u=u->left;
  223. }else if(value>u->value){
  224. u=u->right;
  225. } else{
  226. return;
  227. }
  228. }
  229. if(value<parent->value){
  230. parent->left=new Node(value,parent);
  231. } else if(value>parent->value){
  232. parent->right=new Node(value,parent);
  233. }
  234. }
  235. void writePreOrder(std::ofstream& fout){
  236. writePreOrder(root, fout);
  237. }
  238. bool find(long long value){
  239. return find(root, value);
  240. }
  241. void deleteNode(long long value){
  242. deleteNode(root, value);
  243. }
  244. void countHeight(){
  245. countHeight(root);
  246. }
  247. void countDepth(){
  248. countDepth(root);
  249. }
  250. long long getHeight(){
  251. return root->height;
  252. }
  253. long long getMaxHalfWay(long long value){
  254. return getMaxHalfWay(getNode(root,value));
  255. }
  256. std::set<long long> getDistToLeafsSetDown(long long value){
  257. return getDistToLeafsSetDown(getNode(root, value));
  258. }
  259. void algorithm(long long value){
  260.  
  261. }
  262. };
  263.  
  264. int main(int argc, const char * argv[]) {
  265. std::ifstream fin("input.txt");
  266. std::ofstream fout("output.txt");
  267. BinarySearchTree* tree= new BinarySearchTree();
  268. long long value;
  269. while ( (fin>>value) ){
  270. tree->addNode(value);
  271. }
  272. tree->countHeight();
  273. tree->countDepth();
  274. tree->algorithm(value);
  275. tree->writePreOrder(fout);
  276. delete tree;
  277. return 0;
  278. }
Advertisement
Add Comment
Please, Sign In to add comment