樹形構造的3中搜刮方法示例分享。本站提示廣大學習愛好者:(樹形構造的3中搜刮方法示例分享)文章只能為提供參考,不一定能成為您想要的結果。以下是樹形構造的3中搜刮方法示例分享正文
/**
樹的3中罕見搜刮方法
1.二叉樹方法(每層只要0和1)
2.滿m叉樹(每層都有0 到m - 1)
3.子集樹,也稱為全分列樹
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
const int M = 20;
int n, m;
int ans[M];
//二叉樹
void dfs_two(int cur){
if(cur == n){
for(int i = 0; i < n; i++){
cout << ans[i] << " ";
}
cout << endl;
return;
}
ans[cur] = 1;
dfs_two(cur + 1);
ans[cur] = 0;
dfs_two(cur + 1);
}
//m叉樹
void dfs_m(int cur){
if(cur == n){
for(int i = 0; i < n; i++){
cout << ans[i] << " ";
}
cout << endl;
return ;
}
for(int i =0; i < n; i++){
ans[cur] = i;
dfs_m(cur + 1);
}
}
bool vis[M];
//子集樹
void dfs_sub(int cur){
if(cur == n){
for(int i = 0; i < n; i++){
cout << ans[i] << " ";
}
cout << endl;
return;
}
for(int i = 0; i < n; i++){
if(false == vis[i]){
vis[i] = true;
ans[cur] = i;
dfs_sub(cur + 1);
vis[i] = false;
}
}
}
int main(){
n = 5;
memset(ans, -1, sizeof(ans));
memset(vis, false, sizeof(vis));
dfs_two(0);//二叉樹搜刮
dfs_m(0);//滿m叉樹搜刮
dfs_sub(0);//子集樹搜刮
return 0;
}