剑指 Offer(第2版)面试题 37:序列化二叉树
- 剑指 Offer(第2版)面试题 37:序列化二叉树
- 解法1:深度优先搜索
剑指 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 是二叉搜索树的深度。