AcWing 50. 序列化二叉树
原题链接
困难
作者:
andream7
,
2020-12-26 12:08:15
,
所有人可见
,
阅读 243
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
// Encodes a tree to a single string.
string serialize(TreeNode* root) {
string res;
dfs_s(root, res);
return res;
}
void dfs_s(TreeNode* root, string& res) {
// 当前节点为空,保存null
if (!root) {
res += "null ";
return;
}
res += to_string(root->val) + ' ';
dfs_s(root->left, res);
dfs_s(root->right, res);
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
// u保存当前字符串遍历到的位置
int u = 0;
return dfs_d(data, u);
}
TreeNode* dfs_d(string data, int& u) {
if (u == data.size()) return NULL;
int k = u; // k记录当前节点后空格的位置
while(data[k] != ' ') k++;
if (data[u] == 'n') {
u = k + 1; //u跳到下一个节点
return NULL;
// 空节点没有孩子节点,所以要返回
}
int val = 0;
// 如果节点为负数
if (data[u] == '-') {
for (int i = u + 1; i < k; i++) {
val *= 10;
val += data[i] - '0';
}
val *= -1;
} else {
for (int i = u; i < k; i++) {
val *= 10;
val += data[i] - '0';
}
}
u = k + 1; // u跳到下个节点的开始位置
auto root = new TreeNode(val);
root->left = dfs_d(data, u);
root->right = dfs_d(data, u);
return root;
}
};