Leetcode: Serialize and Deserialize Binary Tree
来源:互联网 发布:javascript 倒计时 编辑:程序博客网 时间:2024/05/22 09:51
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 5as
"[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.
序列化比较好写,就是前序遍历,不过要记录下空节点。用”,“分割数字。反序列化的非递归,鼓捣很久呀。递归应该好写一些。
/** * 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) { string result; if (root == nullptr) { return result; } stack<TreeNode*> nodes; while (root != nullptr || !nodes.empty()) { while (root != nullptr) { result += to_string(root->val) + ","; nodes.push(root); root = root->left; } result += ","; if (!nodes.empty()) { root = nodes.top(); nodes.pop(); root = root->right; } } return result; } bool getNumber(const string& data, int& val, int& pos) { int startPos = pos; bool negative = false; if (data[pos] == '-') { negative = true; ++pos; } val = 0; while (pos < data.size() && data[pos] != ',') { val = val * 10 + (data[pos] - '0'); ++pos; } if (negative) { val = -val; } return (startPos != pos); } // Decodes your encoded data to tree. TreeNode* deserialize(string data) { TreeNode* root = nullptr; TreeNode* prev = nullptr; stack<TreeNode*> nodes; int i = 0; while (i < data.size()) { int val = 0; int j = i; if (getNumber(data, val, j)) { TreeNode* cur = new TreeNode(val); if (root == nullptr) { root = prev = cur; nodes.push(cur); } else { if (prev == nullptr) { prev = nodes.top(); nodes.pop(); prev->right = cur; } else { prev->left = cur; } nodes.push(cur); prev = cur; } } else { if (prev == nullptr) { nodes.pop(); } else { prev = nullptr; } } i = j + 1; } return root; }};// Your Codec object will be instantiated and called as such:// Codec codec;// codec.deserialize(codec.serialize(root));
递归解法,相对简单些。
/** * 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) { string result; if (root == nullptr) { return result; } stack<TreeNode*> nodes; while (root != nullptr || !nodes.empty()) { while (root != nullptr) { result += to_string(root->val) + ","; nodes.push(root); root = root->left; } result += ","; if (!nodes.empty()) { root = nodes.top(); nodes.pop(); root = root->right; } } return result; } bool getNumber(const string& data, int& val, int& pos) { int startPos = pos; bool negative = false; if (data[pos] == '-') { negative = true; ++pos; } val = 0; while (pos < data.size() && data[pos] != ',') { val = val * 10 + (data[pos] - '0'); ++pos; } if (negative) { val = -val; } ++pos; return (startPos + 1 != pos); } TreeNode* deserializeHelper(const string& data, int& start) { TreeNode* root = nullptr; int val = 0; bool isNum = getNumber(data, val, start); if (isNum) { root = new TreeNode(val); root->left = deserializeHelper(data, start); root->right = deserializeHelper(data, start); } return root; } // Decodes your encoded data to tree. TreeNode* deserialize(string data) { int start = 0; return deserializeHelper(data, start); }};// Your Codec object will be instantiated and called as such:// Codec codec;// codec.deserialize(codec.serialize(root));
- leetcode 297 : Serialize and Deserialize Binary Tree
- LeetCode Serialize and Deserialize Binary Tree
- [LeetCode] Serialize and Deserialize Binary Tree
- [LeetCode]Serialize and Deserialize Binary Tree
- LeetCode -- Serialize and Deserialize Binary Tree
- LeetCode Serialize and Deserialize Binary Tree 树
- [LeetCode 297] Serialize and Deserialize Binary Tree
- LeetCode Serialize and Deserialize Binary Tree
- LeetCode 297 Serialize and Deserialize Binary Tree
- Leetcode: Serialize and Deserialize Binary Tree
- [Leetcode]Serialize and Deserialize Binary Tree
- leetcode之Serialize and Deserialize Binary Tree
- leetcode:Serialize and Deserialize Binary Tree
- [LeetCode]297. Serialize and Deserialize Binary Tree
- LeetCode 297. Serialize and Deserialize Binary Tree
- leetcode 297. Serialize and Deserialize Binary Tree
- LeetCode 297. Serialize and Deserialize Binary Tree
- Serialize and Deserialize Binary Tree -- leetcode
- 125Valid Palindrome
- 德国技术工人工资高吗
- 设计师的名言
- 283. Move Zeroes
- php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
- Leetcode: Serialize and Deserialize Binary Tree
- iOS开发:多个按钮点击滑动效果
- 安卓设置默认应用功能失效,设置后仍然总是反复提示选择默认使用的应用
- 看“斯坦福监狱实验”有感
- maven 生命周期
- Android中实用小技巧集锦
- cocos2d-x Programmers Guide v3.3 译本和阅读笔记(第6章UI)
- Marklogic学习 由浅入深(5)-- Marklogic概念解析
- (转)Oracle查询性能优化