297. Serialize and Deserialize Binary Tree

来源:互联网 发布:小猪三网通源码 编辑:程序博客网 时间:2024/05/18 02:39

297. Serialize and Deserialize Binary Tree

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.


解题思路:

    序列化时用层先遍历法,遇到null则往字符串后面加#,否则加上相应的数字并入队。

    解序列化时也用层先遍历

C++代码如下:

string intTostring(int t) {stringstream ss;string s;ss << t;ss >> s;return s;}int stringToint(string s) {if (s == "")return 0;int t;stringstream ss;ss << s;ss >> t;return t;}// Encodes a tree to a single string.string serialize(TreeNode* root) {if (root == NULL)return "";queue<TreeNode*> que;string s = intTostring(root->val);que.push(root);while (!que.empty()) {TreeNode* tmp = que.front();que.pop();if (tmp->left != NULL) {s += "," + intTostring(tmp->left->val);que.push(tmp->left);}else {s += ",#";}if (tmp->right != NULL) {s += "," + intTostring(tmp->right->val);que.push(tmp->right);}else {s += ",#";}}return s;}// Decodes your encoded data to tree.TreeNode* deserialize(string data) {if ("" == data)return NULL;TreeNode* root;int t;t = data.find(',');if (t == -1) {root = new TreeNode(stringToint(data));return root;}else {root=new TreeNode(stringToint(data.substr(0,t)));}data = data.substr(t + 1);queue<TreeNode*> que;que.push(root);while (!que.empty()&&data!="") {TreeNode* tmpnode = que.front();que.pop();TreeNode* children[2];for (int i = 0; i < 2; i++) {t = data.find(',');if (t == -1) {if ("#" == data) {children[i] = NULL;}else {children[i] = new TreeNode(stringToint(data));}data = "";continue;}string val = data.substr(0,t);if ("#" == val) {children[i] = NULL;}else {children[i] = new TreeNode(stringToint(val));}data = data.substr(t + 1);}tmpnode->left = children[0];if(tmpnode->left)que.push(tmpnode->left);tmpnode->right = children[1];if(tmpnode->right)que.push(tmpnode->right);}return root;}

0 0