剑指 Offer(第2版)面试题 37:序列化二叉树
剑指 Offer(第2版)面试题 37:序列化二叉树
题目来源:50. 序列化二叉树
解法1:深度优先搜索
使用 stringstream 流会很方便。
二叉树可以序列化为字符串:
若节点不为空,将节点的 val 直接送入流,如果遇到空指针,将字符串 “null” 送入流,流中节点之间用一个空格区分。深度优先遍历二叉树即可。
字符串反序列化为原始树结构:
每次从流中取出一个字符串 t,当 t 为 “null” 时,返回空结点。否则令 val = stoi(t),以 val 为值建立一个新结点,递归建立它的左子树和右子树。
代码:
/**
* 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)
{
if (root == nullptr)
return "";
stringstream ss;
dfs_serialize(root, ss);
return ss.str();
}
// 辅函数 - 深度优先搜索建立流
void dfs_serialize(TreeNode *root, stringstream &ss)
{
if (root == nullptr)
ss << "null" << ' ';
else
{
ss << root->val << ' ';
dfs_serialize(root->left, ss);
dfs_serialize(root->right, ss);
}
}
// Decodes your encoded data to tree.
TreeNode *deserialize(string data)
{
if (data.empty())
return nullptr;
stringstream ss(data);
return dfs_deserialize(ss);
}
// 辅函数 - 根据流递归建立二叉树
TreeNode *dfs_deserialize(stringstream &ss)
{
string t;
ss >> t;
if (t == "null")
return nullptr;
int val = stoi(t);
TreeNode *root = new TreeNode(val);
root->left = dfs_deserialize(ss);
root->right = dfs_deserialize(ss);
return root;
}
};
复杂度分析:
时间复杂度:O(n),其中 n 是二叉树的节点个数。每个节点都会遍历一次。
空间复杂度:O(depth),其中 depth 是二叉搜索树的深度。