// write your code here cpp
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
#define LOCAL
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
class Solution {
public:
char* Serialize(TreeNode *root) { //这个返回参数这么诡异是因为这是牛客网上定义的
if(!root)
return NULL;
vector<int> tmp;
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
TreeNode* e = q.front();
q.pop();
if(!e) //如果为空指针
tmp.push_back(0xFFFF); //有可能中间是空指针的情况,因为不一定是完全二叉树,要使用占位符
else{
tmp.push_back(e->val);
q.push(e->left);
q.push(e->right);
}
}
int *result = new int[tmp.size()];
memcpy(result, &tmp[0], tmp.size()*sizeof(int));
return (char*)result;//转为字符指针
}
TreeNode* Deserialize(char *str) {
if(!str)
return NULL;
int * p = (int*)str;
if(*p==0xFFFF)
return NULL;
queue<TreeNode*> e;
TreeNode* root = new TreeNode(*p);//树的根节点
e.push(root);
while(!e.empty()){
TreeNode* tmp = e.front();
e.pop();//弹出头节点
if(*(++p)!=0xFFFF){ //不为空节点
tmp->left = new TreeNode(*p);
e.push(tmp->left);
}
else{
tmp->left = NULL;
}
if(*(++p)!=0xFFFF){//不为空节点
tmp->right = new TreeNode(*p);
e.push(tmp->right);
}
else
tmp->right = NULL;
}
return root;
}
};
int main(){
TreeNode * n1 = new TreeNode(100);
TreeNode * n2 = new TreeNode(50);
TreeNode * n3 = new TreeNode(-1);
TreeNode * n4 = new TreeNode(-1);
TreeNode * n5 = new TreeNode(150);
n1->left = n2;
n1->right = NULL;
n2->left = NULL;
n2->right = n5;
Solution s;
char * ses = s.Serialize(n1);
TreeNode* result = s.Deserialize(ses);
return 0;
}
使用层序遍历序列化和反序列化二叉树
最新推荐文章于 2024-06-18 13:52:22 发布