/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
/* ***************后序、中序、先序建树不太好懂,直接采用广度序列************/
/* 先说思路,以前的曾序遍历,在左右子节点不为空的时候插入,现在是
* 如果为空插入一个假的结点。
* 那么在构造树的时候当碰见这些假的结点返回空就行了。
* *********************变量区*************************
* n 用来存放总节点个数
* results 用来存放遍历结果
* *********************注意点*************************
* 一定需要注意的是,不同类型强转特别容易出错,题目给的是小于100的value,后来却有个150
* 所以在将int强转成char的时候,一定要转化为 无符号的char 否则过不了
*/
int n;
char* results;
/* ********************调用区**************************/
char* Serialize(TreeNode *root) {
this->n = pow(2,(dfsserch(root)))-1;//根据深度求出总结点个数 --》81行
this->results = new char[n]; //生成对应长度数组
return bfsserch(root); //开始曾序遍历,--》40行
}
TreeNode* Deserialize(char *str) {
return creatTree(str, 1);//根据char* 建树--》 64行
}
/* ********************外部函数区*********************/
/*曾序遍历序列*/
char* bfsserch(TreeNode* root){
if(root == nullptr){
return nullptr;
}else{
queue<TreeNode*> nodes;nodes.push(root);
int index = 0;//index是数组下标索引
while(!nodes.empty() && index < n){
int size = nodes.size();
while(size>0){
auto temp = nodes.front();
nodes.pop();size--;results[index] = (unsigned char)temp->val;
if(temp->left){nodes.push(temp->left);}else{
TreeNode* fool = new TreeNode(-1);
nodes.push(fool);
}
if(temp->right){nodes.push(temp->right);}else{
TreeNode* fool = new TreeNode(-1);
nodes.push(fool);
}index++;
}
}
return results;
}
}
/*递归建树子函数*/
TreeNode* creatTree(char* str,int cur){
if(cur > n){
return nullptr;
}else{
if((int)str[cur-1] == -1){
//碰见假的结点返回空
return nullptr;
}
TreeNode* head = new TreeNode((unsigned char)str[cur-1]);
// int left = cur*2-1;int right = cur*2;
head->left = creatTree(str,cur*2);
head->right = creatTree(str, cur*2+1);
return head;
}
}
/*返回深度,防止空间浪费*/
int dfsserch(TreeNode* node){
if(node == nullptr){
return 0;
}else{
int left = dfsserch(node->left);
int right = dfsserch(node->right);
return max(left,right)+1;
}
}
};