使用深度優先搜索和廣度優先搜索的方法創建生成樹
//DNF生成樹
#include <iostream>
using namespace std;
const int max_vex=30;
struct linknode//表節點類型定義
{
int adjvex;//鄰接點(於vi連通的其它節點)在頭結點數組中的位置下標
int info;//邊或弧的信息,這裏表示權值
linknode *nextarc;//指向下一個表節點
};
struct vexnode//頂點結點定義類型
{
char data;//頂點信息,這裏用char型表示
//typedef char vextype;使用模板表示
linknode *firstarc;//指向第一個邊節點
};
struct algraph//圖的結構定義
{
int vexnum;
vexnode adjlist[max_vex];//頂點數組
};
void creatalgraph(algraph *G)//想了一下,這個不是重點,可以在
//主函數中輸入圖,或者對頂點數組for輸入
//在依次輸入邊的數據
{}
struct csnode//樹節點結構
{
int data;
csnode *firstchild,*nextsibiling;
};
csnode *dfstree(algralph *G,int v)
{
csnode *t,*ptr,*q;//t爲母樹根節點,ptr爲子樹根節點
linknode *p;
int data2;
visited[v]=true;
t=new csnode;//建立母樹根節點
t->data=G->adjlist[v].data;
t->firstchild=t->nextsibiling=NULL;
q=NULL;//這個q是遞歸的線索,非常重要,子樹根節點做兄弟節點時,在while裏轉時,q=ptr不爲空;子樹節點做孩子節點是在dfs的上半部分程序轉,每次q被賦空值
p=G->adjnode[v].firstarc;
while(p!=NULL)
{
if(!visited[p->adjvex])
{
prt=dfstree(G,p->adjvex);//prt賦值子樹根節點做孩子節點,繼續往深處走
if(q==NULL) t->firstchild=prt;
else q->nextsibiling=prt;
q=ptr;
}
p=p->nextarc;//往旁邊走,此時子樹根節點變爲爲生成樹兄弟節點
}
return t;
}
int main()
{
algraph *G;
int v;bool visited[vexnum];
for(v=0;v<vexnum;v++)//爲圖中頂點建立標記數組
visited[v]=false;
for(int i=0;i<vexnum;i++)//對於非連通圖,要把每個頂點過一遍
{
if(!visited[i]) dnftree(G,v);//這裏沒有處理好
}
return 0;
}
//BNF生成樹
#include <iostream>
using namespace std;
const int max_vex=30;
struct linknode//表節點類型定義
{
int adjvex;//鄰接點(於vi連通的其它節點)在頭結點數組中的位置下標
int info;//邊或弧的信息,這裏表示權值
linknode *nextarc;//指向下一個表節點
};
struct vexnode//頂點結點定義類型
{
char data;//頂點信息,這裏用char型表示
//typedef char vextype;使用模板表示
linknode *firstarc;//指向第一個邊節點
};
struct algraph//圖的結構定義
{
int vexnum;
vexnode adjlist[max_vex];//頂點數組
};
void creatalgraph(algraph *G)//想了一下,這個不是重點,可以在
//主函數中輸入圖,或者對頂點數組for輸入
//在依次輸入邊的數據
{}
struct csnode//樹節點結構
{
int data;
csnode *firstchild,*nextsibiling;
};
struct quene
{
int elem[max_vex];
int front,reat;
}
int main()
{
algraph *G;
int v;bool visited[vexnum];
for(v=0;v<vexnum;v++)//爲圖中頂點建立標記數組
visited[v]=false;
for(int i=0;i<vexnum;i++)//對於非連通圖,要把每個頂點過一遍
{
if(!visited[i]) bnftree(G,v);
}
return 0;
}
csnode *bfstree(algraph *G,int v)
{
cdnode *t,*prt,*q;
linknode *p;
quene *Q=new quene;//建立空隊列
Q->front=Q->rear=0;//通過front和rear的差來判斷隊列是否爲空
int w,k;
visited[v]=TRUE;
t=new csnode;//建立母樹根節點t
t->data=G->adjlist[v].data;
t->firstchild=t->sibiling=NULL;
Q->elem[++Q->rear]=v;//入隊
while(Q->front!=Q->reat)//隊列不空....這裏的循環是爲了接下來出隊列向深處走,所以生成的子樹根節點(也是下面程序生成的第1個根節點)應爲母樹左兒子節點
{
w=Q->elem[++Q->front];//出隊列,賦值給w
q=NULL;
p=G->adjlist[w].firstarc;
while(p!=NULL)//這裏的循環是接下來進隊列即橫向走,所以子樹根節點(也是下面程序生成的第2.3.....個根節點)應爲母樹又兄弟節點
{
k=p->adjvex;
if(!visited[k])
{
visited[k]=TRUE;
ptr=new csnode;
prt->data=G->adjlist[v].data;
prt->firstchild=t->sibiling=NULL;
if(q==NULL) t->firstchild=prt;
else q->nextsibing=prt;
q=prt;
Q->elem[++Q->rear]=k;
}
p=p->nextarc;
}
}
return t;
}