# (肝了三个小时的困难题-必须记录一下)剑指 Offer 37. 序列化二叉树-----python && C++源代码

## 剑指 Offer 37. 序列化二叉树

### Python代码:

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Codec:
def serialize(self, root):
"""Encodes a tree to a single string.
:type root: TreeNode
:rtype: str
"""
if not root: return '[]'
queue = collections.deque()
queue.append(root)
res = []
while queue:
node = queue.popleft()
if node:
res.append(str(node.val))
queue.append(node.left)
queue.append(node.right)
else: res.append('null')
return '[' + ','.join(res) + ']'
def deserialize(self, data):
"""Decodes your encoded data to tree.
:type data: str
:rtype: TreeNode
"""
if data=='[]': return
vals , i = data[1:-1].split(',') , 1
root = TreeNode(int(vals[0]))
queue = collections.deque()
queue.append(root)
while queue:
ans_node = queue.popleft()
if vals[i]!='null':
ans_node.left = TreeNode(int(vals[i]))
queue.append(ans_node.left)
i += 1
if vals[i]!='null':
ans_node.right = TreeNode(int(vals[i]))
queue.append(ans_node.right)
i += 1
return root

### C++代码：

/**
* 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 res;
if(!root) return res;
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
TreeNode* node = q.front();
q.pop();
if(node){
res += to_string(node->val) + ",";  //获取当前节点的值放入res
q.push(node->left); //先将左节点的值压入队列
q.push(node->right);  //又节点的值压入队列
}
else res += "null,";
}
return res.substr(0 , res.size() - 1);
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
if(data.empty())  return nullptr;
vector<string> s = split(data);
queue<TreeNode*> q;
TreeNode* root = new TreeNode(stoi(s[0]));// stoi函数 将n进制的字符串转化为十进制
q.push(root);
int i = 1;
while (!q.empty()){
TreeNode* node = q.front();
q.pop();
if (s[i]!="null"){
node->left = new TreeNode(stoi(s[i]));
q.push(node->left);
}
i++;
if (s[i]!="null"){
node->right = new TreeNode(stoi(s[i]));
q.push(node->right);
}
i++;
}
return root;
}
vector<string> split(string& s){
vector<string> res;
int n = s.size();
int i = 0;
while (i<n){
int j = i+1;
while (j<n && s[j] != ',') j++;
res.push_back(s.substr(i , j-i));
i = j + 1;
}
return res;
}
};

|
1月前
|
Ubuntu C++ Docker
Docker的基本指令和HTML/PYTHON/C++的简单创建示例
Docker的基本指令和HTML/PYTHON/C++的简单创建示例
32 1
|
16天前
|

【Python】已解决error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build
【Python】已解决error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build
79 0
|
22天前
|

C++和Python在内存管理上的主要区别是什么？
【7月更文挑战第2天】C++和Python在内存管理上的主要区别是什么？
24 1
|
1月前
|

python常用算法（5）——树，二叉树与AVL树（一）
python常用算法（5）——树，二叉树与AVL树
23 1
|
1月前
|
Java Go C#

49 3
|
22天前
|

Python和C++在内存管理方面有什么不同？
【7月更文挑战第2天】Python和C++在内存管理方面有什么不同？
17 0
|
22天前
|
Java C++ 开发者

【7月更文挑战第2天】如何根据项目需求选择使用C++还是Python进行内存管理？
21 0
|
22天前
|

C++和Python在内存分配策略上的主要区别是什么？
【7月更文挑战第2天】C++和Python在内存分配策略上的主要区别是什么？
17 0
|
22天前
|
Java 程序员 C++
C++和Python在内存分配、释放以及垃圾回收机制上有何不同？
【7月更文挑战第2天】C++和Python在内存分配、释放以及垃圾回收机制上有何不同？
14 0
|
22天前
|

Python和C++的区别？
【7月更文挑战第2天】Python和C++的区别？
10 0