知识点挺多的还,

动态数组、层次遍历时区分空与非空节点,字符串的特性


#include <cstdint>
class Solution {
public:
    char* Serialize(TreeNode *root) {    
        deque<TreeNode*> workQueue={root};
        TreeNode* cur;
        vector<string> preResult;
        uint_fast32_t count=0,layerSize=1,nextLayerSize=0;
        while(workQueue.size()){
            cur=workQueue.back();
            workQueue.pop_back();
            preResult.push_back((cur?to_string(cur->val):"#")+",");
            count+=preResult.back().size();

            if(cur){
			  	layerSize--;
                if(cur->left){
                    workQueue.push_front(cur->left);nextLayerSize++;
                }else{workQueue.push_front(nullptr);}
                if(cur->right){
                    workQueue.push_front(cur->right);nextLayerSize++;
                }else{workQueue.push_front(nullptr);}
            }
            if(layerSize==0){
                layerSize=nextLayerSize;
            }
        } 
        
   
        char *result=new char[count];
        count=0;
        for(auto &s:preResult){
            for(auto &si:s){
                result[count]=si;
                count++;
            }
        }



        return result;
    }
    TreeNode* Deserialize(char *str) {
        char *cur=str;
        string curNum;
        TreeNode *beforeResult=new TreeNode(1),*curNode,*workNode;
        deque<TreeNode*> workQueue={beforeResult};
        bool left=false;
        

        while((*cur)!='\0'&&workQueue.size()){
            //cout<<cur<<endl;
            if(*cur==','){
                if(curNum=="#"){
                    workNode=nullptr;
                 }else{
                    workNode=new TreeNode(stoi(curNum));
                }
               curNode=workQueue.back();
                if(left){
                    curNode->left=workNode;
                }else{
                    curNode->right=workNode;
                    workQueue.pop_back();
                }
                left=!left;
                if(workNode)workQueue.push_front(workNode);
                curNum="";

            }else{
                curNum+=*cur;
            }
            cur++;

        }
        delete [] str;
        cout<<endl;
        return beforeResult->right;

    
    }
};