题目:
Serialization is the process of converting a data structure or object into a sequence of bits so that it can be stored in a file or memory buffer, or transmitted across a network connection link to be reconstructed later in the same or another computer environment.
Design an algorithm to serialize and deserialize a binary tree. There is no restriction on how your serialization/deserialization algorithm should work. You just need to ensure that a binary tree can be serialized to a string and this string can be deserialized to the original tree structure.
For example, you may serialize the following tree
1 / \ 2 3 / \ 4 5 as "[1,2,3,null,null,4,5]" , just the same as how LeetCode OJ serializes a binary tree . You do not necessarily need to follow this format, so please be creative and come up with different approaches yourself.
Note: Do not use class member/global/static variables to store states. Your serialize and deserialize algorithms should be stateless.
思路:
1)编码过程:采用先序遍历来序列化二叉树,如果结点为空,就用一个特殊字符‘#’来表示;为了便于后续采用istringstream来对字符串进行分割,我们用空格来分割不同数值。这个先序遍历的过程可以采用递归来实现。
2)解码过程:思路和编码过程就刚好是相反的了^_^。
感叹一下:什么时候自己才能把代码写的又高效又精炼呢?每次自己写了之后再参考网上解法,都会发现别人的代码写的比我的少好多行。。。
代码:
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Codec { public: // Encodes a tree to a single string. string serialize(TreeNode* root) { if (!root) { return "#"; } string left = serialize(root->left); string right = serialize(root->right); return to_string(root->val) + " " + left + " " + right; } // Decodes your encoded data to tree. TreeNode* deserialize(string data) { istringstream iss(data); return DFS(iss); } private: TreeNode* DFS(istringstream &iss) { string val; iss >> val; if (val == "#") { return NULL; } TreeNode *root = new TreeNode(stoi(val)); TreeNode *left = DFS(iss), *right = DFS(iss); root->left = left, root->right = right; return root; } }; // Your Codec object will be instantiated and called as such: // Codec codec; // codec.deserialize(codec.serialize(root));