题目:请实现两个函数,分别用来序列化和反序列化二叉树。
算法思想:
根据前序遍历规则完成序列化与反序列化。所谓序列化指的是遍历二叉树为字符串;所谓反序列化指的是依据字符串重新构造成二叉树。
依据前序遍历序列来序列化二叉树,因为前序遍历序列是从根结点开始的。当在遍历二叉树时碰到Null指针时,这些Null指针被序列化为一个特殊的字符“#”。另外,结点之间的数值用逗号隔开。
class Solution {
public:
char* Serialize(TreeNode *pRoot) {
string s;
if (!pRoot)
return NULL;
deque<TreeNode*> q;
q.push_back(pRoot);
while (!q.empty()) {
int n = q.size();
for (int i = 0; i < n; ++i) {
if (q.front()) {
q.push_back(q.front()->left);
q.push_back(q.front()->right);
s += to_string(q.front()->val) + ' ';
} else {
s += "# ";
}
q.pop_front();
}
}
char* chr = strdup(s.c_str());
return chr;
}
TreeNode* Deserialize(char *str) {
if (!str)
return nullptr;
int k = 0;
auto ret = nextNode(str, k);
deque<TreeNode*> q;
q.push_back(ret);
while (!q.empty()) {
int n = q.size();
for (int i = 0; i < n; ++i) {
q.front()->left = nextNode(str, k);
q.front()->right = nextNode(str, k);
if (q.front()->left)
q.push_back(q.front()->left);
if (q.front()->right)
q.push_back(q.front()->right);
q.pop_front();
}
}
return ret;
}
TreeNode* nextNode(char *str,int &i) {
string s;
while (str[i] != '\0'&&str[i] != ' ') {
if (str[i] == '#') {
i += 2;
return nullptr;
}
s += str[i];
i++;
}
if (str[i] == ' ')
i++;
if (!s.empty())
return new TreeNode(stoi(s));
return nullptr;
}
};