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

京公网安备 11010502036488号