题链:https://leetcode-cn.com/problems/xu-lie-hua-er-cha-shu-lcof/
思路 :想复杂了,虽然必须有中序才可以唯一确定一棵树(自己写的是中序+先序)。但是,只要是同一逻辑,即可确定一个树,直接先序遍历编码即可。
注意:队列传入的时候要加引用,靠!!
/**
* 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 getStr(int x){
if(x==0) return "0";
string ans="";
while(x){
ans+='0'+x%10;
x/=10;
}
reverse(ans.begin(),ans.end());
return ans;
}
string ans="";
void dfs(TreeNode* root){
if(root==NULL){
ans+="null,";
return ;
}
ans+=getStr(root->val)+',';
dfs(root->left);
dfs(root->right);
}
int getNum(string s){
int num = 0;
for(int i=0;i<s.size();i++){
num=num*10+(s[i]-'0');
}
//cout<<s<<" "<<num<<endl;
return num;
}
// Encodes a tree to a single string.
string serialize(TreeNode* root) {
ans="";
dfs(root);
return ans;
}
//加引用!!!!!!!!!!!!!!!!!!!!!!
TreeNode * dfs1(queue<string>& q){
string str=q.front();
q.pop();
if(str=="null")
return NULL;
TreeNode * root = new TreeNode();
root->val=getNum(str);
if(!q.empty())
root->left=dfs1(q);
if(!q.empty())
root->right=dfs1(q);
return root;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
//cout<<data<<endl;
queue<string> q;
int len = data.size();
int i=0;
while(i<len){
int j=i;
string s="";
while(data[j]!=',')
s+=data[j++];
q.push(s);
i=j+1;
}
TreeNode * root = dfs1(q);
return root;
}
};
// Your Codec object will be instantiated and called as such:
// Codec codec;
// codec.deserialize(codec.serialize(root));