#include <iostream>
#include <cstdlib>
#include <vector>
typedef unsigned long long ull_t;
using namespace std;
struct TreeNode {
char key;
ull_t depth;
ull_t nodeNumber;
TreeNode* left;
TreeNode* right;
};
class Tree {
public:
Tree(ull_t maxDepth, ull_t k);
void print();
private:
ull_t maxDepth;
ull_t nodeNumber;
ull_t currentNodeNumber;
bool finished;
vector<char> word;
TreeNode* root;
void insert (TreeNode* node);
};
Tree::Tree(ull_t maxDepth, ull_t nodeNumber) {
this->maxDepth = maxDepth;
this->nodeNumber = nodeNumber;
this->finished = false;
currentNodeNumber = 1;
root = new TreeNode;
root->key = 'a';
root->depth = 1;
root->nodeNumber = currentNodeNumber;
root->left = NULL;
root->right = NULL;
if (maxDepth > 1)
insert(root);
else
if (this->nodeNumber==1)
this->finished=true;
}
void Tree::print() {
if (this->finished) {
word.push_back('a');
for (vector<char>::iterator it=word.end()-1;it >= word.begin();it--)
cout << *it;
} else {
cout << "NIE";
}
}
void Tree::insert(TreeNode* node) {
node->left = new TreeNode;
node->left->depth = node->depth + 1;
node->left->nodeNumber = ++currentNodeNumber;
if (node->key == 'a') {
node->left->key ='b';
} else {
node->left->key ='a';
}
if (node->left->nodeNumber==this->nodeNumber) {
this->finished = true;
} else {
if (node->left->depth < maxDepth) {
insert(node->left);
}
}
if(this->finished) {
this->word.push_back(node->left->key);
} else {
node->right = new TreeNode;
node->right->depth = node->depth + 1;
node->right->nodeNumber = ++currentNodeNumber;
if (node->key == 'c') {
node->right->key ='b';
} else {
node->right->key ='c';
}
if (node->right->nodeNumber==this->nodeNumber) {
this->finished = true;
} else {
if (node->right->depth < maxDepth) {
insert(node->right);
}
}
if (this->finished) this->word.push_back(node->right->key);
}
}
int main(int argc, char *argv[]) {
ull_t n = strtoll(argv[1],NULL, 10);
ull_t k = strtoll(argv[2],NULL, 10);
Tree tree = Tree(n,k);
tree.print();
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | #include <iostream> #include <cstdlib> #include <vector> typedef unsigned long long ull_t; using namespace std; struct TreeNode { char key; ull_t depth; ull_t nodeNumber; TreeNode* left; TreeNode* right; }; class Tree { public: Tree(ull_t maxDepth, ull_t k); void print(); private: ull_t maxDepth; ull_t nodeNumber; ull_t currentNodeNumber; bool finished; vector<char> word; TreeNode* root; void insert (TreeNode* node); }; Tree::Tree(ull_t maxDepth, ull_t nodeNumber) { this->maxDepth = maxDepth; this->nodeNumber = nodeNumber; this->finished = false; currentNodeNumber = 1; root = new TreeNode; root->key = 'a'; root->depth = 1; root->nodeNumber = currentNodeNumber; root->left = NULL; root->right = NULL; if (maxDepth > 1) insert(root); else if (this->nodeNumber==1) this->finished=true; } void Tree::print() { if (this->finished) { word.push_back('a'); for (vector<char>::iterator it=word.end()-1;it >= word.begin();it--) cout << *it; } else { cout << "NIE"; } } void Tree::insert(TreeNode* node) { node->left = new TreeNode; node->left->depth = node->depth + 1; node->left->nodeNumber = ++currentNodeNumber; if (node->key == 'a') { node->left->key ='b'; } else { node->left->key ='a'; } if (node->left->nodeNumber==this->nodeNumber) { this->finished = true; } else { if (node->left->depth < maxDepth) { insert(node->left); } } if(this->finished) { this->word.push_back(node->left->key); } else { node->right = new TreeNode; node->right->depth = node->depth + 1; node->right->nodeNumber = ++currentNodeNumber; if (node->key == 'c') { node->right->key ='b'; } else { node->right->key ='c'; } if (node->right->nodeNumber==this->nodeNumber) { this->finished = true; } else { if (node->right->depth < maxDepth) { insert(node->right); } } if (this->finished) this->word.push_back(node->right->key); } } int main(int argc, char *argv[]) { ull_t n = strtoll(argv[1],NULL, 10); ull_t k = strtoll(argv[2],NULL, 10); Tree tree = Tree(n,k); tree.print(); return 0; } |
English