剑指 Offer 37. 序列化二叉树
请实现两个函数,分别用来序列化和反序列化二叉树。
你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
提示:输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。
示例:
输入:root = [1,2,3,null,null,4,5]
输出:[1,2,3,null,null,4,5]
学习要点:
int 转 string : to_string(int)
string 转 int : stoi(string)
string后面添加内容:
字符串: .append( 串 )
字符: .push_back(字符)
代码:
我才用层序遍历的方法,用“,”隔开节点,并且记录NULL
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Codec { public: // Encodes a tree to a single string. string serialize(TreeNode* root) { string s; if(root==NULL) return ""; s.append(to_string(root->val)); // to_string将数字变成string s+=','; queue<TreeNode*> Q; Q.push(root); while(!Q.empty()) { TreeNode* p=Q.front(); Q.pop(); if(p->left!=NULL) { Q.push(p->left); s.append(to_string(p->left->val)); } else s+='N'; s+=','; if(p->right!=NULL) { Q.push(p->right); s.append(to_string(p->right->val)); } else s+='N'; s+=','; } return s; } // Decodes your encoded data to tree. TreeNode* deserialize(string data) {
if (data.length()==0) return NULL; int i=0; string t; while(data[i]!=',') t.push_back(data[i++]); // 长度不为0,那肯定有数字 // append后面添加是字符串,push_back添加字符 int tnum=stoi(t); // 字符串变数字 i++; // 跳过逗号 TreeNode* head=new TreeNode(tnum); // 最后输出的头指针 TreeNode* head2=head; queue<TreeNode*> Q; Q.push(head2); while(!Q.empty()) { TreeNode* p=Q.front(); Q.pop(); // 处理左儿子 if(data[i]=='N') i+=2; //说明是空指针 else { string t; while(data[i]!=',') t.push_back(data[i++]); int tnum=stoi(t); i++; p->left=new TreeNode(tnum); Q.push(p->left); } // 处理右儿子 if(data[i]=='N') i+=2; //说明是空指针 else { string t; while(data[i]!=',') t.push_back(data[i++]); int tnum=stoi(t); i++; p->right=new TreeNode(tnum); Q.push(p->right); } if (i>=data.length()) break; } return head; } }; // Your Codec object will be instantiated and called as such: // Codec ser, deser; // TreeNode* ans = deser.deserialize(ser.serialize(root));