/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*//** Encodes a tree to a single string. */char*serialize(structTreeNode* root){//基本思路 层序遍历if(!root)returnNULL;char* tree =(char*)malloc(sizeof(char)*100000);//这里的charpos是记录字符串当前到什么位置了int size =0,rear =-1,top =-1,charpos =0;structTreeNode* queue[50000],*pos = root;
queue[++rear]= pos;while(rear != top){
size = rear - top;while(size--){
pos = queue[++top];if(!pos)
charpos +=sprintf(tree+charpos,",%s","null");else{if(!top)
charpos +=sprintf(tree+charpos,"%d",pos->val);else
charpos +=sprintf(tree+charpos,",%d",pos->val);//当存在时 则导入其节点 不存在时 则放入NULL 方便检测if(pos->left) queue[++rear]= pos->left;else queue[++rear]=NULL;if(pos->right) queue[++rear]= pos->right;else queue[++rear]=NULL;}}//当只存在空结点时 则退出循坏if(rear - top == nullnumbers)break;}return tree;}/** Decodes your encoded data to tree. */structTreeNode*deserialize(char* data){if(!data)returnNULL;//这里是设定最小值constint MIN =-99999;int numpos =0,charpos =0,num[50000],number,tempnumpos =0,nextlevel;structTreeNode* stack[50000],*realroot,*root;
bool flag;//flag的作用是检测是否为负数 因为负数占两个格子//下面的while主要将有效数字提取出来 变成数组while(charpos <strlen(data)){
flag = false;if(data[charpos]==',')
charpos++;
number =0;//当出现负数时if(data[charpos]=='-'){
flag = true;
charpos++;}if(data[charpos]>='0'&& data[charpos]<='9'){while(data[charpos]>='0'&& data[charpos]<='9')
number = number*10+ data[charpos++]-'0';if(!flag)
num[numpos++]= number;else
num[numpos++]=-number;}else{
num[numpos++]= MIN;
charpos +=4;}}//创建根节点
realroot =(structTreeNode*)malloc(sizeof(structTreeNode));
realroot->val = num[tempnumpos];
realroot->left = realroot->right =NULL;
stack[tempnumpos]= realroot;//nextlevel的作用是 确定左右节点的在数组中的位置
nextlevel = tempnumpos+1;while(tempnumpos < numpos){if(num[tempnumpos]!= MIN){if(nextlevel < numpos && num[nextlevel]!= MIN){
root =(structTreeNode*)malloc(sizeof(structTreeNode));
root->val = num[nextlevel];
root->right = root->left =NULL;
stack[tempnumpos]->left = root;
stack[nextlevel]= root;}else
stack[tempnumpos]->left =NULL;//向下移动位置
nextlevel++;if(nextlevel < numpos && num[nextlevel]!= MIN){
root =(structTreeNode*)malloc(sizeof(structTreeNode));
root->val = num[nextlevel];
root->left = root->right =NULL;
stack[tempnumpos]->right = root;
stack[nextlevel]= root;}else
stack[tempnumpos]->right =NULL;//向下移动位置
nextlevel++;}
tempnumpos++;}while(tempnumpos < numpos);return realroot;}// Your functions will be called as such:// char* data = serialize(root);// deserialize(data);
代码实现(二刷 DAY 167 C++ 双百)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/classCodec{public:// Encodes a tree to a single string.
string serialize(TreeNode* root){
string ret;
vector<TreeNode*> next,now;if(root){
now.emplace_back(root);
ret +=to_string(root->val);
ret +=',';}while(now.size()){
next.clear();for(constauto& ptr:now){if(ptr->left){
next.emplace_back(ptr->left);
ret +=to_string(ptr->left->val);}else ret.push_back('_');
ret.push_back(',');if(ptr->right){
next.emplace_back(ptr->right);
ret +=to_string(ptr->right->val);}else ret.push_back('_');
ret.push_back(',');}
now = next;}return ret;}// Decodes your encoded data to tree.
TreeNode*deserialize(string data){
vector<int> num;
string s;
vector<TreeNode*> now,next;
TreeNode* ret =nullptr;int pos =0;for(constauto& chr:data){if(chr ==','){if(s.size()) num.emplace_back(stoi(s));
s.clear();}elseif(chr =='_')
num.emplace_back(INT_MIN);else s.push_back(chr);}if(data.empty())returnnullptr;
ret =newTreeNode(num[0]);++pos;
now.emplace_back(ret);while(now.size()){
next.clear();for(constauto& ptr:now){if(num[pos]!= INT_MIN){
ptr->left =newTreeNode(num[pos]);
next.emplace_back(ptr->left);}if(num[pos+1]!= INT_MIN){
ptr->right =newTreeNode(num[pos+1]);
next.emplace_back(ptr->right);}
pos +=2;}
now = next;}return ret;}};// Your Codec object will be instantiated and called as such:// Codec ser, deser;// TreeNode* ans = deser.deserialize(ser.serialize(root));
代码实现(三刷自解 细节很多 需要多做 DAY 258 C++)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/classCodec{public:// Encodes a tree to a single string.
string serialize(TreeNode* root){
string ret;
queue<TreeNode*> queue;
queue.emplace(root);while(!queue.empty()){int size = queue.size();for(int i =0;i < size;++i){auto root = queue.front();
queue.pop();if(root){
ret +=to_string(root->val);
queue.emplace(root ? root->left :nullptr);
queue.emplace(root ? root->right :nullptr);}else ret +="_";
ret +=',';}}return ret;}// Decodes your encoded data to tree.
TreeNode*deserialize(string data){
string tmp;
vector<int> v;for(constauto& chr:data){if(chr ==','){if(tmp.size()) v.emplace_back(stoi(tmp));
tmp.clear();continue;}if(chr =='_') v.emplace_back(INT_MAX);else tmp += chr;}int pos =0,v_size = v.size();
TreeNode* root = v[pos]== INT_MAX ?nullptr:newTreeNode(v[pos]);++pos;
queue<TreeNode*> queue;if(root) queue.emplace(root);while(queue.size()){int size = queue.size();for(int i =0;i < size;++i){
TreeNode* pre = queue.front();
queue.pop();if(pre){
pre->left =(v[pos]== INT_MAX ?nullptr:newTreeNode(v[pos]));
pre->right =(v[pos +1]== INT_MAX ?nullptr:newTreeNode(v[pos +1]));
pos +=2;}if(pre->left) queue.emplace(pre->left);if(pre->right) queue.emplace(pre->right);}}return root;}};
代码实现(四刷自解 DAY 299 C++)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/classCodec{public:
string serialize(TreeNode* root){
deque<TreeNode*> deque;
deque.emplace_back(root);
string ret;bool nextlevel =true;while(!deque.empty()&& nextlevel){int size = deque.size();
nextlevel =false;for(int i =0; i < size;++i){
TreeNode* ptr = deque.front();
deque.pop_front();if(!ptr){
ret +="_,";continue;}
ret +=to_string(ptr->val);
ret +=',';
deque.emplace_back(ptr->left);
deque.emplace_back(ptr->right);if(ptr->left || ptr->right){
nextlevel =true;}}}return ret;}intGetNextNum(const string& data,int& index){if(index >= data.size())return INT_MIN;if(data[index]=='_'){
index +=2;return INT_MIN;}int num =0;bool neg =false;if(data[index]=='-'){
neg =true;++index;}while(index < data.size()&& data[index++]!=','){
num *=10;
num +=(data[index -1]-'0');}if(neg) num =-num;return num;}// Decodes your encoded data to tree.
TreeNode*deserialize(string data){if(data.empty()|| data[0]=='_')returnnullptr;int index =0;int num =GetNextNum(data, index);
TreeNode* ret =newTreeNode(num);
deque<TreeNode*> deque;
deque.emplace_back(ret);while(index < data.size()){int size = deque.size();for(int i =0; i < size;++i){
TreeNode* prev = deque.front();
deque.pop_front();int leftnum =GetNextNum(data, index);int rightnum =GetNextNum(data, index);
TreeNode* left = leftnum != INT_MIN ?newTreeNode(leftnum):nullptr;
TreeNode* right = rightnum != INT_MIN ?newTreeNode(rightnum):nullptr;
prev->left = left;
prev->right = right;if(left) deque.emplace_back(left);if(right) deque.emplace_back(right);}}return ret;}};// Your Codec object will be instantiated and called as such:// Codec ser, deser;// TreeNode* ans = deser.deserialize(ser.serialize(root));
代码实现(五刷自解 DAY 11 Golang)
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/type Codec struct{}funcConstructor() Codec {return Codec{}}// Serializes a tree to a single string.func(this *Codec)serialize(root *TreeNode)string{
s :=&strings.Builder{}if root ==nil{
s.WriteString("_,")return s.String()}
deq :=[]*TreeNode{}
deq =append(deq, root)forlen(deq)!=0{
size :=len(deq)for i :=0; i < size; i++{
ptr := deq[i]if ptr !=nil{
s.WriteString(strconv.Itoa(ptr.Val))}else{
s.WriteByte('.')}
s.WriteByte(',')if ptr !=nil{
deq =append(deq, ptr.Left)
deq =append(deq, ptr.Right)}}
deq = deq[size:]}return s.String()}// Deserializes your encoded data to tree.func(this *Codec)deserialize(data string)*TreeNode {iflen(data)==0|| data[0]=='_'{returnnil}
pos, nextpos :=0,0for; nextpos <len(data)&& data[nextpos]!=','; nextpos++{}var ret *TreeNode =nilif val, err := strconv.Atoi(data[pos:nextpos]); err ==nil{
ret =&TreeNode{Val : val}}
pos, nextpos = nextpos +1, nextpos +1
deq :=[]*TreeNode{}
deq =append(deq, ret)forlen(deq)!=0{
size :=len(deq)
judge :=falsefor i :=0; i < size; i++{
ptr := deq[i]var left , right *TreeNode =nil,nilfor; nextpos <len(data)&& data[nextpos]!=','; nextpos++{}if val, err := strconv.Atoi(data[pos:nextpos]); err ==nil{
left =&TreeNode{Val : val}
ptr.Left, deq = left,append(deq, left)
judge =true}
pos, nextpos = nextpos +1, nextpos +1for; nextpos <len(data)&& data[nextpos]!=','; nextpos++{}if val, err := strconv.Atoi(data[pos:nextpos]); err ==nil{
right =&TreeNode{Val : val}
ptr.Right, deq = right,append(deq, right)
judge =true}
pos, nextpos = nextpos +1, nextpos +1}
deq = deq[size:]if judge ==false{break}}return ret
}/**
* Your Codec object will be instantiated and called as such:
* ser := Constructor();
* deser := Constructor();
* data := ser.serialize(root);
* ans := deser.deserialize(data);
*/