树与回溯法 数据结构

     在程序设计中,有一类问题,其要求是求解一组解、求全部解或求最优解,这种问题的求解不是按照确定的计算法则进行,而是利用试探和回溯的搜索技术求解。
     回溯法的求解过程实质上是先序遍历一棵“状态树”的过程,只是这棵树不是预先建立的,而是隐含在遍历的过程中。

  void preorder (BiTNode *root)  {//先序遍历root指向根的二叉树

          if (root!=NULL)   {

              cout<< root->data;//访问根结点

              preorder(root->Lchild); //先序遍历根的左子树

              preorder(root->Rchild); //先序遍历根的右子树

          }//if

    }//preorder

 

例:求含有n个元素的集合的幂集

如:A={1,2,3}

p(A)={{1,2,3},{1,2},{1,3},{1},{2},{2,3},{3},{}}

#include <iostream>
#define MAX_SIZE 256
using namespace std;
int set[MAX_SIZE];
void PowerSet(int i,int n)
{
if(i>n){
for(int j=1;j<=n;j++)
if(set[j]==true)
cout<<j<<'';
cout<<endl;
}
else{
set[i]=true;PowerSet(i+1,n);
set[i]=false;PowerSet(i+1,n);

}

}

int main()
{
int n;
cin>>n;
for(int i=0;i<MAX_SIZE;i++)
set[i]=false;
PowerSet(1,n);
return 0;
}


求的n个数的排列。如:n=3,{1,2,3},{1,3,2},{2,1,3},{2,3,1},{3,1,2},{3,2,1}

#include <iostream>
#include <memory.h>
using namespace std;
int v[20],ans[20]; //v is used to tell whether the parameter has been used(0 means not ,1 means yes)
int n;
void dfs(int k,int n){
if(k>=n){
for(int i=0;i<n;i++){
cout<<ans[i]<<" ";
}
cout<<endl;
}
else{
for(int i=0;i<n;i++){
if(!v[i]){
v[i]=1;
ans[k]=i+1;
dfs(k+1,n);
v[i]=0;
}
}
}
}

int main(){
int i;
memset(v,0,sizeof(v));
memset(ans,0,sizeof(ans));
cin>>n;
dfs(0,n);
return 0;
}



没有更多推荐了,返回首页