剑指offer 061、序列化二叉树
题目
题解
咦~ 困难… 我可以的… 好难啊… 看看解析去… (⊙o⊙)?…
写了两三个小时了… 还是不太会…
借助队列----看代码吧
/*
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) {
if (!root) return nullptr;
string s;
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
if (q.front()) {
q.push(q.front()->left);
q.push(q.front()->right);
s += to_string(q.front()->val) + ' ';
}
else {
s += "# ";
}
q.pop();
}
// strdup:复制字符串,可以自动分配空间(如果这里使用strcpy,还需手动分配内存)
char* result = strdup(s.c_str());
return result;
}
TreeNode* Deserialize(char *str) {
if (!str) return nullptr;
int k = 0;
TreeNode* result = nextNode(str, k);
queue<TreeNode*> q;
q.push(result);
while (!q.empty()) {
q.front()->left = nextNode(str, k);
q.front()->right = nextNode(str, k);
if (q.front()->left)
q.push(q.front()->left);
if (q.front()->right)
q.push(q.front()->right);
q.pop();
}
return result;
}
private:
TreeNode* nextNode(char* str, int& k) {
string s;
while (str[k] != '\0' && str[k] != ' ') {
if (str[k] == '#') {
k += 2; // #后面还有一个空字符,所以要加2
return nullptr;
}
s += str[k];
++k;
}
if (str[k] == ' ')
k++;
if (!s.empty())
// stio:将字符串转换为整数
return new TreeNode(stoi(s));
return nullptr;
}
};