#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
struct NodeData {
char name[99];
};
struct BstNode {
NodeData *data;
BstNode *left;
BstNode *right;
};
bool operator== (NodeData data1, NodeData data2) {
return (strcmp(data1.name, data2.name) == 0);
}
bool operator< (NodeData data1, NodeData data2) {
return (strcmp(data1.name, data2.name) < 0);
}
BstNode *NewBstNode(NodeData*);
BstNode *insertData(BstNode*, NodeData*);
void serialize(BstNode*, FILE*);
void deSerialize(BstNode*&, FILE*);
bool searchData(BstNode*, NodeData*);
int main() {
/** Serialize */
/*
BstNode *root = NULL;
NodeData *data = new NodeData();
cin>>data->name;
root = insertData(root, data);
cin>>data->name;
root = insertData(root, data);
FILE *fp = fopen("db.bin", "w");
serialize(root, fp);
*/
/** DeSerialize */
BstNode *root = NULL;
FILE *fp = fopen("db.bin", "r");
deSerialize(root, fp);
cout<<root->data->name;
return 0;
}
BstNode *NewBstNode(NodeData *data) {
BstNode *newNode = new BstNode();
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
BstNode *insertData(BstNode *root, NodeData *data) {
NodeData *realdata = new NodeData();
*realdata = *data;
if(root == NULL) {
root = NewBstNode(realdata);
} else {
if(memcmp(realdata->name, root->data->name, 1) <= 0) {
root->left = insertData(root->left, realdata);
} else {
root->right = insertData(root->right, realdata);
}
}
return root;
}
void serialize(BstNode *root, FILE *fp) {
if(root == NULL)
return;
fwrite(&root, sizeof(struct BstNode), 1, fp);
serialize(root->left, fp);
serialize(root->right, fp);
}
void deSerialize(BstNode *&root, FILE *fp) {
NodeData *data = new NodeData;
if(!fread(data, sizeof(struct BstNode), 1, fp))
return;
root = NewBstNode(data);
deSerialize(root->left, fp);
deSerialize(root->right, fp);
}
bool searchData(BstNode *root, NodeData *data) {
if(root == NULL) {
return false;
} else if(*root->data == *data) {
return true;
} else if(*data < *root->data) {
return searchData(root->left, data);
} else {
return searchData(root->right, data);
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGlvPgojaW5jbHVkZSA8Y3N0cmluZz4KI2luY2x1ZGUgPGNzdGRsaWI+CgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCgpzdHJ1Y3QgTm9kZURhdGEgewogICAgY2hhciBuYW1lWzk5XTsKfTsKCgpzdHJ1Y3QgQnN0Tm9kZSB7CiAgICBOb2RlRGF0YSAqZGF0YTsKICAgIEJzdE5vZGUgKmxlZnQ7CiAgICBCc3ROb2RlICpyaWdodDsKfTsKCmJvb2wgb3BlcmF0b3I9PSAoTm9kZURhdGEgZGF0YTEsIE5vZGVEYXRhIGRhdGEyKSB7CiAgICByZXR1cm4gKHN0cmNtcChkYXRhMS5uYW1lLCBkYXRhMi5uYW1lKSA9PSAwKTsKfQoKYm9vbCBvcGVyYXRvcjwgKE5vZGVEYXRhIGRhdGExLCBOb2RlRGF0YSBkYXRhMikgewogICAgcmV0dXJuIChzdHJjbXAoZGF0YTEubmFtZSwgZGF0YTIubmFtZSkgPCAwKTsKfQoKCkJzdE5vZGUgKk5ld0JzdE5vZGUoTm9kZURhdGEqKTsKQnN0Tm9kZSAqaW5zZXJ0RGF0YShCc3ROb2RlKiwgTm9kZURhdGEqKTsKdm9pZCBzZXJpYWxpemUoQnN0Tm9kZSosIEZJTEUqKTsKdm9pZCBkZVNlcmlhbGl6ZShCc3ROb2RlKiYsIEZJTEUqKTsKYm9vbCBzZWFyY2hEYXRhKEJzdE5vZGUqLCBOb2RlRGF0YSopOwoKCmludCBtYWluKCkgewogICAgLyoqIFNlcmlhbGl6ZSAqLwovKgogICAgQnN0Tm9kZSAqcm9vdCA9IE5VTEw7CiAgICBOb2RlRGF0YSAqZGF0YSA9IG5ldyBOb2RlRGF0YSgpOwoKICAgIGNpbj4+ZGF0YS0+bmFtZTsKICAgIHJvb3QgPSBpbnNlcnREYXRhKHJvb3QsIGRhdGEpOwogICAgY2luPj5kYXRhLT5uYW1lOwogICAgcm9vdCA9IGluc2VydERhdGEocm9vdCwgZGF0YSk7CgogICAgRklMRSAqZnAgPSBmb3BlbigiZGIuYmluIiwgInciKTsKICAgIHNlcmlhbGl6ZShyb290LCBmcCk7CiovCiAgICAvKiogRGVTZXJpYWxpemUgKi8KCiAgICBCc3ROb2RlICpyb290ID0gTlVMTDsKCiAgICBGSUxFICpmcCA9IGZvcGVuKCJkYi5iaW4iLCAiciIpOwoKICAgIGRlU2VyaWFsaXplKHJvb3QsIGZwKTsKICAgIGNvdXQ8PHJvb3QtPmRhdGEtPm5hbWU7CgogICAgcmV0dXJuIDA7Cn0KCgpCc3ROb2RlICpOZXdCc3ROb2RlKE5vZGVEYXRhICpkYXRhKSB7CiAgICBCc3ROb2RlICpuZXdOb2RlID0gbmV3IEJzdE5vZGUoKTsKICAgIG5ld05vZGUtPmRhdGEgPSBkYXRhOwogICAgbmV3Tm9kZS0+bGVmdCA9IE5VTEw7CiAgICBuZXdOb2RlLT5yaWdodCA9IE5VTEw7CiAgICByZXR1cm4gbmV3Tm9kZTsKfQoKCkJzdE5vZGUgKmluc2VydERhdGEoQnN0Tm9kZSAqcm9vdCwgTm9kZURhdGEgKmRhdGEpIHsKICAgIE5vZGVEYXRhICpyZWFsZGF0YSA9IG5ldyBOb2RlRGF0YSgpOwogICAgKnJlYWxkYXRhID0gKmRhdGE7CiAgICBpZihyb290ID09IE5VTEwpIHsKICAgICAgICByb290ID0gTmV3QnN0Tm9kZShyZWFsZGF0YSk7CiAgICB9IGVsc2UgewogICAgICAgIGlmKG1lbWNtcChyZWFsZGF0YS0+bmFtZSwgcm9vdC0+ZGF0YS0+bmFtZSwgMSkgPD0gMCkgewogICAgICAgICAgICByb290LT5sZWZ0ID0gaW5zZXJ0RGF0YShyb290LT5sZWZ0LCByZWFsZGF0YSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcm9vdC0+cmlnaHQgPSBpbnNlcnREYXRhKHJvb3QtPnJpZ2h0LCByZWFsZGF0YSk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHJvb3Q7Cn0KCnZvaWQgc2VyaWFsaXplKEJzdE5vZGUgKnJvb3QsIEZJTEUgKmZwKSB7CiAgICBpZihyb290ID09IE5VTEwpCiAgICAgICAgcmV0dXJuOwogICAgZndyaXRlKCZyb290LCBzaXplb2Yoc3RydWN0IEJzdE5vZGUpLCAxLCBmcCk7CiAgICBzZXJpYWxpemUocm9vdC0+bGVmdCwgZnApOwogICAgc2VyaWFsaXplKHJvb3QtPnJpZ2h0LCBmcCk7Cn0KCnZvaWQgZGVTZXJpYWxpemUoQnN0Tm9kZSAqJnJvb3QsIEZJTEUgKmZwKSB7CiAgICBOb2RlRGF0YSAqZGF0YSA9IG5ldyBOb2RlRGF0YTsKICAgIGlmKCFmcmVhZChkYXRhLCBzaXplb2Yoc3RydWN0IEJzdE5vZGUpLCAxLCBmcCkpCiAgICAgICAgcmV0dXJuOwogICAgcm9vdCA9IE5ld0JzdE5vZGUoZGF0YSk7CiAgICBkZVNlcmlhbGl6ZShyb290LT5sZWZ0LCBmcCk7CiAgICBkZVNlcmlhbGl6ZShyb290LT5yaWdodCwgZnApOwp9Cgpib29sIHNlYXJjaERhdGEoQnN0Tm9kZSAqcm9vdCwgTm9kZURhdGEgKmRhdGEpIHsKICAgIGlmKHJvb3QgPT0gTlVMTCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0gZWxzZSBpZigqcm9vdC0+ZGF0YSA9PSAqZGF0YSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIGlmKCpkYXRhIDwgKnJvb3QtPmRhdGEpIHsKICAgICAgICByZXR1cm4gc2VhcmNoRGF0YShyb290LT5sZWZ0LCBkYXRhKTsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHNlYXJjaERhdGEocm9vdC0+cmlnaHQsIGRhdGEpOwogICAgfQp9Cg==