【剑指offer】【树】37.序列化二叉树
题目链接:https://leetcode-cn.com/problems/xu-lie-hua-er-cha-shu-lcof/
递归
前序遍历序列化成字符串,在反序列化回去
注意:不要忘记null和数字后面空格,空格作为分隔两个节点的标识
时间复杂度:O(n)
空间复杂度:O(n)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Codec {
public:
// Encodes a tree to a single string.
string serialize(TreeNode* root) {
string res;
dfs_s(root, res);
return res;
}
void dfs_s(TreeNode* root, string &res)
{
if(!root) {
res += "null ";
return ;
}
res += to_string(root->val) + ' ';
dfs_s(root -> left, res);
dfs_s(root -> right, res);
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
int u = 0;
return dfs_d(data, u);
}
TreeNode* dfs_d(string data, int &u)
{
if(u == data.size()) return NULL;
//取出来下一个元素
int k = u;
while(data[k] != ' ') k++;
//如果为空
if(data[u] == 'n'){
u = k + 1;
return NULL;
}
int val = 0;
if(data[u] == '-'){
//把字符串转换成整数
for (int i = u+1; i < k; i++) val = val * 10 + data[i] - '0';
val = -val;
}
else{
//如果是数字是正的
for (int i = u; i < k; i++) val = val * 10 + data[i] - '0';
}
//更新到下一个位置
u = k + 1;
//前序遍历,先取的一定是根节点,之后取的一定是左子树,最后取的一定是右子树
//根节点
auto root = new TreeNode(val);
//根节点的左儿子
root -> left = dfs_d(data, u);
//根节点的右儿子
root -> right = dfs_d(data, u);
return root;
}
};
// Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));
知识的价值不在于占有,而在于使用