问题:实现两个函数,序列化一个二叉树。
如果之前做过一个题目: 用一颗二叉树的中序和前序还原二叉树的话,最直观的解法是用把二叉树系列化成一个中序序列和一个前序序列,但是这个方法的缺陷是每个节点上的值不能相同,而且需要将整个序列都读入之后才能序列化,如果序列到一个流中,在从流中读出来还原二叉树效率将会比较低。
其实序列化的时候只需要前序就可以了,只是遍历到每个NULL指针的时候对应的序列化位天成一个特殊符号即可(如'#').还原的时候,直接从前往后读,靠前的是根节点,和它相邻的如果不是# 则是它的左孩子....如果碰到'#'则正证明当前指针应该是空指针,赋予空指针之后并返回到父节点处理其它分枝。下面是我实现的代码
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
char* Serialize(TreeNode *root){
string str="";
MySerialize(root,str);
char * result = new char[str.size()+1];
strcpy(result,str.c_str());
return result;
}
void MySerialize(TreeNode * root,string & str){
if(root ==NULL) {
str+='#';
return;
}
char temp[10];
sprintf(temp,"%d",root->val);
str+= temp;
str+=",";
MySerialize(root->left,str);
MySerialize(root->right,str);
}
TreeNode* Deserialize(char *str) {
if(str==NULL || *str=='#') return NULL;
int index = 0;
return MyDeserialize(str,index);
}
TreeNode* MyDeserialize(char *str,int &index){
if(str[index]=='\0') return NULL;
if(str[index]=='#'){ index++; return NULL;}
int cval = 0;
while(str[index]!=','){
cval *=10;
cval += int(str[index]-'0');
index++;
}
index++;
TreeNode * root = new TreeNode(cval);
root->left = MyDeserialize(str,index);
root->right = MyDeserialize(str,index);
return root;
}
};