知识点挺多的还,
动态数组、层次遍历时区分空与非空节点,字符串的特性
#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; } };