剑指 Offer 37. 序列化二叉树
作者:互联网
请实现两个函数,分别用来序列化和反序列化二叉树。
你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
提示:输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。
示例:
你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
提示:输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。
示例:
输入:root = [1,2,3,null,null,4,5]
输出:[1,2,3,null,null,4,5]
很简单的一道题,
注意题意是自己编码成什么样,然后再从什么样翻译回去
dfs即可
注意空间开大点,数字可能是负数
/** * 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. void dfs(TreeNode* root, string& str) { if(root == nullptr) { str += "null,"; return; } str += to_string(root->val); str += ","; dfs(root->left, str); dfs(root->right, str); } int Num(string str) { int flag = 0; if(str[0] == '-') flag = 1; int num = 0; for(int i = flag == 1 ? 1 : 0; i < str.length(); i++) { num *= 10; num += str[i] - '0'; } return flag == 1 ? -num : num; } int k, n; string str[100010]; void dfs2(TreeNode*& root) { if(k > n) return; if(str[k] == "null") { k++; root = nullptr; return; } root = new TreeNode(Num(str[k++])); dfs2(root->left); dfs2(root->right); } string serialize(TreeNode* root) { string str = ""; dfs(root, str); return str; } // Decodes your encoded data to tree. TreeNode* deserialize(string data) { TreeNode* root = nullptr; int i = 0; n = 0; while(i < data.length()) { string temp = ""; while(data[i] != ',') temp += data[i++]; str[n++] = temp; i++; } // // if(str[0] == "null") return root; // root = new TreeNode(Num(str[0])); k = 0; dfs2(root); return root; } }; // Your Codec object will be instantiated and called as such: // Codec codec; // codec.deserialize(codec.serialize(root));
标签:TreeNode,string,int,37,二叉树,str,序列化,root 来源: https://www.cnblogs.com/WTSRUVF/p/16478555.html