Advertisement
Guest User

Untitled

a guest
Feb 17th, 2020
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.91 KB | None | 0 0
  1. #include <fstream>
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <map>
  6.  
  7. using namespace std;
  8.  
  9. struct Node {
  10. char code = NULL;
  11. int w = 0;
  12. Node *parent = NULL;
  13. Node *left = NULL;
  14. Node *right = NULL;
  15. };
  16.  
  17. void updateWeight(Node *root) {
  18. root->w++;
  19. if (root->parent != NULL)
  20. updateWeight(root->parent);
  21. }
  22.  
  23. void updateChildren(Node *parent) {
  24. if (parent->left->w > parent->right->w) {
  25. swap(parent->left, parent->right);
  26. }
  27. }
  28.  
  29. void switchNodes(Node *n1, Node *n2) {
  30. if (n1->parent->left == n1) {
  31. n1->parent->left = n2;
  32. } else {
  33. n1->parent->right = n2;
  34. }
  35.  
  36. if (n2->parent->left == n2) {
  37. n2->parent->left = n1;
  38. } else {
  39. n2->parent->right = n1;
  40. }
  41.  
  42. swap(n1->parent, n2->parent);
  43. updateChildren(n1->parent);
  44. }
  45.  
  46. void recount(Node *escp) {
  47. if (escp != NULL) {
  48. escp->w = escp->left->w + escp->right->w;
  49. recount(escp->parent);
  50. }
  51. }
  52.  
  53.  
  54. vector<Node *> sortTree(vector<Node *> tree) {
  55. bool n = false;
  56. int ind;
  57. for (int i = tree.size() - 1; i > 0; i--) {
  58. for (int j = i - 1; j > -1; j--) {
  59. if (tree[i]->w > tree[j]->w) {
  60. n = true;
  61. ind = j;
  62. }
  63. }
  64. if (n) {
  65. switchNodes(tree[i], tree[ind]);
  66. swap(tree[i], tree[ind]);
  67. break;
  68. }
  69. }
  70. return tree;
  71. }
  72.  
  73. vector<bool> getCode(Node *n, vector<bool> code) {
  74. if (n->parent == NULL)
  75. return code;
  76. if (n->parent->left == n) {
  77. code.push_back(0);
  78. } else {
  79. code.push_back(1);
  80. }
  81. if (n->parent->parent != NULL)
  82. code = getCode(n->parent, code);
  83. return code;
  84. }
  85.  
  86. void outCode(vector<bool> code) {
  87. for (int i = code.size() - 1; i >= 0; i--) {
  88. cout << code[i];
  89. }
  90. }
  91.  
  92. int main() {
  93. ifstream file("../test.txt");
  94. vector<Node *> tree;
  95. map<char, Node *> leaves;
  96. Node *root = new Node;
  97. Node *esc = root;
  98. tree.push_back(root);
  99.  
  100. string word;
  101. getline(file, word);
  102.  
  103. for (auto &letter : word) {
  104. if (leaves[letter] != NULL) {
  105. updateWeight(leaves[letter]);
  106.  
  107. outCode(getCode(leaves[letter], vector<bool>()));
  108. } else {
  109. leaves[letter] = new Node;
  110. leaves[letter]->code = letter;
  111. leaves[letter]->parent = esc;
  112.  
  113. Node *tmp = new Node;
  114. tmp->parent = esc;
  115.  
  116. esc->left = tmp;
  117. esc->right = leaves[letter];
  118. tree.push_back(leaves[letter]);
  119. tree.push_back(tmp);
  120.  
  121. outCode(getCode(esc, vector<bool>()));
  122. cout << letter;
  123.  
  124. esc = tmp;
  125. updateWeight(leaves[letter]);
  126. }
  127. tree = sortTree(tree);
  128. recount(esc->parent);
  129. }
  130. file.close();
  131. return 0;
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement