二叉树的序列化与反序列化

来源:互联网 发布:nike跑步鞋推荐 知乎 编辑:程序博客网 时间:2024/03/28 21:47

参考网上的代码,使用先序遍历,若左/右孩子为空则记为‘#’

用惯了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();}};

0 0
原创粉丝点击