解码和复原的思考:
其实只有前序的序列才可以实现,前序的情况第一个是根节点,所以才方便以此为开端建树
实现思路
字符串转换为二叉树
(1)先将所有字符串按逗号分隔出整数
(2)再利用整数新new节点,将所有的节点都存储在vector中
可以发现题中给出的序列是前序遍历,也就是意味着第一个为根节点,遍历vector中除根节点以外的节点依次开始建树
二叉树转换为字符串
(1)实现将大于等于1位的整数转换为字符串
(2)转换之前先拼接[
(3)转换之后再拼接]
(4)中间过程记得除了第一位,都在前面加上,此过程可借助一个标志变量来控制
说明一点这种情况结束后,vector是释放掉没有了,但是new出来的树节点还在
实现代码
/**
* 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:
string int2string(int x){
if(!x) return "0";
string s="";
while(x){
s+=char('0'+x%10);
x/=10;
}
reverse(s.begin(),s.end());
return s;
}
// Encodes a tree to a single string.
void get_string(TreeNode* root,string &s,bool &flag){
if(!root){
return;
}
if(flag){
s+=",";
}else{
flag=true;
}
s+=int2string(root->val);
get_string(root->left,s,flag);
get_string(root->right,s,flag);
}
string serialize(TreeNode* root) {
string s="[";
bool begin=false;
get_string(root,s,begin);
s+="]";
// cout<<s<<endl;
return s;
}
void build_node(vector<TreeNode*> &a,string &s){
int n=s.length()-2;
if(!n){
return ;
}
int i=1;
int t=0;
while(i<n+1){
if(isdigit(s[i])){
t=t*10+s[i]-'0';
}else{
a.push_back(new TreeNode(t));
t=0;
}
i++;
}
a.push_back(new TreeNode(t));
}
void build_tree(TreeNode* a,TreeNode *root){
if(a->val<root->val){
if(!root->left){
root->left=a;
return;
}
else{
build_tree(a,root->left);
}
}
else{
if(!root->right){
root->right=a;
return;
}
else{
build_tree(a,root->right);
}
}
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
vector<TreeNode*> a;
build_node(a,data);
// for(auto item:a){
// cout<<(item->val)<<endl;
// }
if(a.size()==0) return NULL;
TreeNode *root=a[0];
for(int i=1;i<a.size();i++)
build_tree(a[i],root);
return root;
}
};
// Your Codec object will be instantiated and called as such:
// Codec* ser = new Codec();
// Codec* deser = new Codec();
// string tree = ser->serialize(root);
// TreeNode* ans = deser->deserialize(tree);
// return ans;