算法题39:序列化二叉树
思路
序列化:
按照前序遍历思路,用‘#’表示空结点,将结点数值转换成字符串添加到二叉树字符串末尾,用‘!’来表示一个数值的结束。
反序列化:
将字符串中的数值提取出来赋值给二叉树结点。
代码
void preOrder(TreeNode *node, string &s){
if(node == NULL){
s.push_back('#'); //外部结点用#号表示
return;
}
string str = to_string(node->val); //将数字转换成字符串
s.append(str + '!'); //!表示一个数结束
preOrder(node->left, s);
preOrder(node->right, s);
}
char* Serialize(TreeNode *root) {
//前序遍历
string s; //char*是字符指针,指向一个字符串
preOrder(root, s);
char *res = new char[s.size() + 1]; //char* 指向一个字符数组,最后有一个'\0'
strcpy(res, s.c_str()); //拷贝字符串
return res;
}
// 按照前序遍历顺序构造二叉树
TreeNode *depreOrder(char *str, int &idx){
if(str[idx] == '\0') return NULL; //遍历完成
if(str[idx] == '#'){// 空结点
idx++;
return NULL;
}
int num = 0;
while(str[idx] != '!'){ //计算结点值
num *= 10;
num += str[idx] - '0';
idx++;
}
TreeNode *head = new TreeNode(num);
idx += 1;
head->left = depreOrder(str, idx);
head->right = depreOrder(str, idx);
return head;
}
TreeNode* Deserialize(char *str) {
int idx = 0;
return depreOrder(str, idx);
}