297. Serialize and Deserialize Binary Tree
/**
* 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) {
ostringstream out;
queue<TreeNode*> Q;
Q.push(root);
while(!Q.empty()) {
TreeNode* p = Q.front();
Q.pop();
if(p) {
out << p->val << " ";
Q.push(p->left);
Q.push(p->right);
}
else out << "null ";
}
return out.str();
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
istringstream input(data);
string str = "";
vector<TreeNode*> V;
while(input >> str) {
if(str == "null") V.push_back(NULL);
else V.push_back(new TreeNode(stoi(str)));
}
for(int ii = 0, jj = 1; jj < V.size(); ii++) {
if(V[ii] == NULL) continue;
if(jj < V.size()) V[ii]->left = V[jj++];
if(jj < V.size()) V[ii]->right = V[jj++];
}
return V[0];
}
};
// Your Codec object will be instantiated and called as such:
// Codec ser, deser;
// TreeNode* ans = deser.deserialize(ser.serialize(root));
理解不了,看的大佬的解题
/**
* 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) {
ostringstream out;
queue<TreeNode*> Q;
Q.push(root);
while (!Q.empty()) {
TreeNode* tmp = Q.front();
Q.pop();
if (tmp) {
out << tmp->val << " ";
Q.push(tmp->left);
Q.push(tmp->right);
}
else out << "null ";
}
return out.str();
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
istringstream input(data);
string val;
vector<TreeNode*> vec;
while (input >> val) {
if (val == "null") vec.push_back(NULL);
else vec.push_back(new TreeNode(stoi(val)));
}
int j = 1; // i每往后移动一位,j移动两位,j始终是当前i的左子下标
for (int i = 0; j < vec.size(); ++i) { // 肯定是j先到达边界,所以这里判断j < vec.size()
if (vec[i] == NULL) continue; // vec[i]为null时跳过。
if (j < vec.size()) vec[i]->left = vec[j++]; // 当前j位置为i的左子树
if (j < vec.size()) vec[i]->right = vec[j++]; // 当前j位置为i的右子树
}
return vec[0];
}
};
// Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));