解题思路:
本题目通过画树可以得知输出的是树上的每一个节点而非叶子节点,所以不用加条件if (u==n)
啥的,这种题目要不就是数组要不就是使用vector数组。注意回溯的方式,以下给了两种方法
注意代码1中的一个细节问题,本题目可以结合排列数字的题目看
代码1:
#include<iostream>
using namespace std;
int n;
const int N=15;
int a[N];
int st[N];
void dfs(int u,int in){
for(auto &t:a){
if(t!=0)
cout<<t<<' ';
}
cout<<endl;
for(int i=in;i<=n;i++){
if(st[i]==0){
a[u]=i;
st[i]=1;
//cout<<i<<' '<<endl;
dfs(u+1,i+1);
a[u]=0; //这里一定要重新置位0,否则出错!!!!因为是取每个节点
st[i]=0;
}
}
}
int main(){
cin>>n;
dfs(0,1);
return 0;
}
代码2:
#include<iostream>
#include<vector>
using namespace std;
vector<vector<int>>res;
int n;
vector<int>temp;
void dfs(vector<vector<int>>&res,int u){
res.push_back(temp);
for(auto &t:temp){
cout<<t<<' ';
}
cout<<endl;
for(int i=u;i<=n;i++){
temp.push_back(i);
dfs(res,i+1);
temp.pop_back();
}
}
int main(){
cin>>n;
dfs(res,1);
return 0;
}