二叉树的序列化与反序列化 发表于 2022-05-19 | 分类于 数据结构 , 二叉树 , 二叉树的序列化与反序列化 | 二叉树的序列化与反序列化 297.二叉树的序列化与反序列化123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354//先序遍历求解class Codec {public: //将二叉树序列化为字符串 string serialize(TreeNode* root) { string res; helper(root, res); return res; } //辅助函数,将二叉树存入string中 void helper(TreeNode* root, string& s){ if(root==NULL){ s += "#,"; }else{ s += to_string(root->val) + ","; helper(root->left, s); helper(root->right, s); } } //将字符串反序列化为二叉树 TreeNode* deserialize(string data) { //将字符串转化成链表 list<string> lst; //借助一个字符串来控制"," string str; for(auto& ch : data){ if(ch==','){ lst.push_back(str); str.clear(); }else{ str.push_back(ch); } } if(!str.empty()){ lst.push_back(str); str.clear(); } return build(lst); } //辅助函数,通过链表构造二叉树 TreeNode* build(list<string>& data){ if(data.front()=="#"){ data.erase(data.begin()); return NULL; } TreeNode* root = new TreeNode(stoi(data.front())); data.erase(data.begin()); root->left=build(data); root->right=build(data); return root; }}; 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061//先序遍历求解type Codec struct {}func Constructor() Codec { return Codec{}}//将二叉树序列化为字符串func (this *Codec) serialize(root *TreeNode) string { var res string this.helper(root, &res) return res}//辅助函数,将二叉树存入string中func (this *Codec) helper(root *TreeNode, s *string) { if root == nil { *s += "#," } else { *s += strconv.Itoa(root.Val) + "," this.helper(root.Left, s) this.helper(root.Right, s) }}//将字符串反序列化为二叉树func (this *Codec) deserialize(data string) *TreeNode { //将字符串转化成切片 lst := []string{} //借助一个字符串来控制"," str := "" for _, ch := range data { if ch == ',' { lst = append(lst, str) str = "" } else { str += string(ch) } } if str != "" { lst = append(lst, str) str = "" } return this.build(&lst)}//辅助函数,通过切片构造二叉树func (this *Codec) build(data *[]string) *TreeNode { if (*data)[0] == "#" { *data = (*data)[1:] return nil } val, _ := strconv.Atoi((*data)[0]) root := &TreeNode{Val: val} *data = (*data)[1:] root.Left = this.build(data) root.Right = this.build(data) return root} -------------本文结束 感谢阅读------------- 本文作者: HReina 本文链接: http://hreina.com/2022/05/19/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E5%BA%8F%E5%88%97%E5%8C%96%E4%B8%8E%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96/ 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!