6 搜索
6.1 深度优先搜索
[算法描述]
1.访问根结点;
2.依次对每一棵子树进行深度优先搜索.
[源程序]
struct TreeType
{
intData,Degree,Child[256];
} ;
void DFS(struct TreeType Tree[256], int x)
{
inti;
printf("%d ",Tree[x].Data);
for(i=1;i<=Tree[x].Degree;i++) DFS(Tree,Tree[x].Child[i]);
}
6.2 宽度优先搜索
[算法描述]
1.将根结点加入队列;
2.如果队列不空,重复执行以下操作:
(1)从队列中拿出一个结点;
(2)访问该结点;
(3)把该结点的所有子结点全部加入队列.
[源程序]
struct TreeType
{
intData,Degree,Child[256];
} ;
struct QueueType
{
intData;
structQueueType *Next;
} ;
void BFS(struct TreeType Tree[256], int Root)
{
structQueueType *Head,*Tail,*Temp;
inti,x;
Head=(struct QueueType *)malloc(sizeof(struct QueueType));
Tail=Head;
Head->Data=Root;
Head->Next=NULL;
while(Head!=NULL)
{
x=Head->Data;
Temp=Head;
Head=Head->Next;
free(Temp);
printf("%d ",Tree[x].Data);
for (i=1;i<=Tree[x].Degree;i++)
if (Head==NULL)
{
Head=(struct QueueType *)malloc(sizeof(struct QueueType));
Tail=Head;
Head->Data=Tree[x].Child[i];
Head->Next=NULL;
}
else
{
Temp=(struct QueueType *)malloc(sizeof(struct QueueType));
Temp->Data=Tree[x].Child[i];
Temp->Next=NULL;
Tail->Next=Temp;
Tail=Temp;
}
}
}
6.3 穷举
[算法描述]
设有n种物品,每种物品b[i]个,此算法就是按照某种规则遍历出物品所有的组合方式.
[源程序]
for (i=0;i<=n;i++) a[i]=0;
while (a[0]==0)
{
j=n;
while(a[j]==b[j]) j--;
a[j]++;
for(i=j+1;i<=n;i++) a[i]=0;
/*此时数组a中保存了当前的组合方式*/
}