题目描述
请实现两个函数,分别用来序列化和反序列化二叉树。
您需要确保二叉树可以序列化为字符串,并且可以将此字符串反序列化为原始树结构。
样例
Input:
8
/ \
12 2
/ \
6 4
Output:[8 12 2 null null 6 4 null null null null]
解题思路
-
描述
本题目就是使用某一种方式同时实现创建二叉树和遍历二叉树。(这里我使用的是层次方式)
-
实现代码:
/* struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; */ string serialize(TreeNode* root) { string res; // 存储返回结果 queue<TreeNode*> q; TreeNode* tmp; q.push(root); while(q.size()) { tmp = q.front(); q.pop(); if(tmp == NULL) { res += "null "; continue; } res += to_string(tmp->val) + " "; q.push(tmp->left); q.push(tmp->right); } return res; } TreeNode* deserialize(string data) { int index = 0,val = 0; // index用于记录当前所在字符串位置,val存储一个节点的值 int k = index; // k标记一个节点在字符串中的结束 while(data[k] != ' ' && (k < data.size())) k++; if(data[index] == 'n') // 表明该节点内容为null { return NULL; } for(int i=index;i < k;i++) { val = val * 10 + data[i] - '0'; } index = k + 1; TreeNode* root = new TreeNode(val); queue<TreeNode*> q; TreeNode* tmp; q.push(root); while(q.size() && index < data.size()) { tmp = q.front(); q.pop(); if(index < data.size()) // 该if用于处理tmp->left { k = index; while((data[k] != ' ') && (k < data.size())) k++; if(data[index] == 'n') { tmp->left = NULL; index = k + 1; } else { val = 0; for(int i=index;i < k;i++) { val = val * 10 + data[i] - '0'; } index = k + 1; tmp->left = new TreeNode(val); q.push(tmp->left); } } if(index < data.size()) // 该if用于处理tmp->right { k = index; while(data[k] != ' ' && (k < data.size())) k++; if(data[index] == 'n') { tmp->right = NULL; index = k + 1; } else { val = 0; for(int i=index;i < k;i++) { val = val * 10 + data[i] - '0'; } index = k + 1; tmp->right = new TreeNode(val); q.push(tmp->right); } } } return root; }