classCodec{public:// Encodes a tree to a single string.stringserialize(Node*root){if(root==nullptr)return"";strings;queue<Node*>q{{root}};s+=to_string(root->val)+" ";while(!q.empty())for(intsz=q.size();sz>0;--sz){Node*node=q.front();q.pop();if(node->children.empty()){s+="n";}else{for(Node*child:node->children){q.push(child);s+=to_string(child->val)+"#";}}s+=" ";}returns;}// Decodes your encoded data to tree.Node*deserialize(stringdata){if(data.empty())returnnullptr;istringstreamiss(data);stringword;iss>>word;Node*root=newNode(stoi(word));queue<Node*>q{{root}};while(iss>>word){Node*parent=q.front();q.pop();vector<string>kids=getKids(word);vector<Node*>children;for(conststring&kid:kids){if(kid=="n")continue;Node*child=newNode(stoi(kid));children.push_back(child);q.push(child);}parent->children=children;}returnroot;}private:vector<string>getKids(conststring&word){vector<string>kids;for(inti=0,j=0;j<word.length();++j)if(word[j]=='#'){kids.push_back(word.substr(i,j-i));i=j+1;}returnkids;}};
classCodec{// Encodes a tree to a single string.publicStringserialize(Noderoot){if(root==null)return"";StringBuildersb=newStringBuilder().append(root.val).append(",");Queue<Node>q=newArrayDeque<>(Arrays.asList(root));while(!q.isEmpty())for(intsz=q.size();sz>0;--sz){Nodenode=q.poll();if(node.children.isEmpty()){sb.append("n");}else{for(Nodechild:node.children){q.offer(child);sb.append(child.val).append("#");}}sb.append(",");}returnsb.toString();}// Decodes your encoded data to tree.publicNodedeserialize(Stringdata){if(data.equals(""))returnnull;finalString[]vals=data.split(",");Noderoot=newNode(Integer.parseInt(vals[0]));Queue<Node>q=newArrayDeque<>(Arrays.asList(root));for(inti=1;i<vals.length;++i){Nodeparent=q.poll();finalString[]kids=vals[i].split("#");List<Node>children=newArrayList<>();for(finalStringkid:kids){if(kid.equals("n"))continue;Nodechild=newNode(Integer.parseInt(kid));children.add(child);q.offer(child);}parent.children=children;}returnroot;}}