参考网上的代码,使用先序遍历,若左/右孩子为空则记为‘#’
用惯了string, 一个char* 的返回值快把我搞cry了
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
class Solution {
char *rlt;
char *fixRlt;
public:
Solution() : rlt(new char[1000])
{
}
~Solution()
{
delete[] rlt;
delete[] fixRlt;
}
char* Serialize(TreeNode *root) {
if (root == nullptr)
{
fixRlt = new char[1];
fixRlt[0] = '\0';
return fixRlt;
}
int i = 0;
s_core(root, i);
fixRlt = new char[i + 1];
for (int j = 0; j < i; ++j)
fixRlt[j] = rlt[j];
fixRlt[i] = '\0';
return fixRlt;
}
TreeNode* Deserialize(char *str) {
TreeNode* root;
if (str[0] == '\0') return nullptr;
int i = 0;
ds_core(str, i, root);
return root;
}
void s_core(TreeNode *root, int& i)
{
if (!root)
{
rlt[i] = '#'; rlt[i + 1] = ' ';
i += 2;
}
else
{
string valStr = intToString(root->val);
for (size_t j = 0; j < valStr.length(); ++j, ++i)
rlt[i] = valStr[j];
rlt[i++] = ' ';
s_core(root->left, i);
s_core(root->right, i);
}
}
void ds_core(char *str, int& i, TreeNode*& root)
{
if (str[i] == '\0') return;
int token = 0; bool isNumber = false;
if (!readNextToken(str, i, isNumber, token))
return;
if (isNumber) {
root = new TreeNode(0);
root->val = token;
ds_core(str, i, root->left);
ds_core(str, i, root->right);
}
}
bool readNextToken(char* str, int& i, bool& isNum, int& token)
{
token = 0;
while (str[i] == ' ') ++i;
if (str[i] == '\0')
{
isNum = false;
return false;
}
else if (str[i] == '#')
{
++i;
isNum = false;
return false;
}
else
{
isNum = true;
while (str[i] >= '0' && str[i] <= '9')
{
token *= 10;
token += str[i] - '0';
++i;
}
return true;
}
}
string intToString(int x)
{
stringstream ss;
ss << x;
return ss.str();
}
};