剑指 Offer 37. 序列化二叉树
class Codec {
public:
void rserialize(TreeNode*root,string&str){
if(root==NULL){//遇到空指针,就添加None,(不要忘记逗号)
str+="None,";
}else{//遇到数字,就添加数字对应的字符串(同样也不要忘记逗号)
str+=to_string(root->val)+",";
rserialize(root->left,str);
rserialize(root->right,str);
}
}
// Encodes a tree to a single string.
string serialize(TreeNode* root) {
string ret;
rserialize(root,ret);
return ret;
}
TreeNode*rdeserialize(list<string>&dataArray){
if(dataArray.front()=="None"){//如果第一个就是空指针,那么整棵树就是一棵空树
dataArray.erase(dataArray.begin());
return NULL;
}
//先创建当前节点
TreeNode*root=new TreeNode(stoi(dataArray.front()));
dataArray.erase(dataArray.begin());
root->left=rdeserialize(dataArray);//创建左子树的过程中,相应的节点会被删掉。
root->right=rdeserialize(dataArray);
return root;
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
list<string>dataArray;
string str;
for(auto&ch:data){//逗号做分隔符
if(ch==','){
dataArray.push_back(str);
str.clear();
}else{//当前字符不是逗号,那就和之前的字符一起拼接
str.push_back(ch);
}
}
return rdeserialize(dataArray);
}
};
剑指 Offer 38. 字符串的排列
思路:
1.对字符串进行排序
2.剪枝
3.全排列
class Solution {
public:
string path;//临时路径
vector<string>res;//结果集
vector<bool>visited;//判断字符是否已经被访问过
vector<string> permutation(string s) {
visited=vector<bool>(s.length());//默认都为false
sort(s.begin(),s.end());//排序字符串
dfs(s,0);
return res;
}
//全排列
//k:已经访问了k个字符
void dfs(string s,int k){
if(k==s.length()){
res.push_back(path);
return;
}
//进行N叉树搜索
for(int i=0;i<s.length();i++){
//剪枝
if(i>0&&s[i-1]==s[i]&&!visited[i-1]){//i-1肯定比i先访问到
continue;//同层相同字符不重复考虑
}
if(!visited[i]){
visited[i]=true;//先标记为已访问,这样在下面层就不会重复添加了
path.push_back(s[i]);//加入到路径之中
dfs(s,k+1);//下一层
//回溯过程防止和下一个路径冲突
path.erase(path.end()-1);
visited[i]=false;
}
}
}
};