怎麼用圖的深度和廣度優先遍歷來遍歷樹呢?我是這樣想的,把樹構造成圖就行了。
//#include "stdafx.h"
#include "linkqueue.h"
#include #include #define vrtype int//在這裡是權值型別
#define max_vertex_num 10//最大頂點個數
#define vertextype char //頂點型別
#define infinity 32767 //無窮大,不連通
//邊的結構
typedef struct arccellarccell,adjmatrix[max_vertex_num][max_vertex_num];
//圖的結構
typedef struct mgraph;
//輔助陣列,記錄從u到v-u的最小代價的邊
typedef struct closedge;
//typedef struct edgeedge[100];
//函式宣告
void createmgraph(mgraph &g);//建立圖
void printgraph(mgraph g);//列印圖
void prim(mgraph g,vertextype v,mgraph &tg);//
void kruskal(mgraph g,mgraph &tg);
//找到結點v在圖g中的序號,返回,沒找到返回-1
int locatevex(mgraph g,vertextype v);
void initgraph(mgraph &g,int arcnum,int vertexnum);//初始化圖
//把g圖中的一條邊新增到tg中去
void addarc(mgraph &tg,mgraph g,vertextype v1,vertextype v2,vrtype weight);
//返回v結點的第乙個鄰接頂點的序號,沒找到返回-1
int firstadjvex(mgraph g,vertextype v);
//返回v相對於w的下乙個鄰接點,若w是v的最後乙個鄰接頂點,返回-1
int nextadjvex(mgraph g,vertextype v,vertextype w);
//遞迴深度優先遍歷圖
int visited[max_vertex_num] = ;//訪問標記陣列
void dfsg(mgraph g,void (*visit)(vertextype));
void dfs(mgraph g,int i);
//非遞迴廣度優先遍歷圖
void bfsg(mgraph g,void(*visit)(vertextype));
//對結點的操作函式
void (*visitfunc)(vertextype v);//全域性變數,方便訪問visitnode
void visitnode(vertextype v);
int main()
} return k;
}/*---------*/
void printclosee(closedge*close,int n)
}//按權值從小到大排序
int cmp(const void *a,const void *b)
void kruskal(mgraph g,mgraph &tg)
} }qsort(e,k,sizeof(e[0]),cmp);
print(e,k,g);
int *vset = (int *)malloc(sizeof(int)*g.vexnum);
for (i=0;ibegin];
int set2 = vset[e[j]->end]; //得到兩頂點屬於的集合
/*----------
printf("set1 = %d||set2 = %d\n",set1,set2);
/*----------*/
if (set1!=set2)
}int firstadjvex(mgraph g,vertextype v) }}
/void bfsg(mgraph g,void(*visit)(vertextype))}}
} }}//
void visitnode(vertextype v)
廣度優先用到的佇列:
#include #include #define qelemtype char
typedef struct qnode*queueptr;
struct linkqueue;
void initqueue(linkqueue &q)
q.front->next = null;
}void enqueue(linkqueue &q,qelemtype e)
p->data = e;
p->next = null;
q.rear->next = p;
q.rear = p;
}int dequeue(linkqueue &q,qelemtype &e)
p = q.front->next;
e = p->data;
q.front->next = p->next;
if(q.rear==p)
free(p);
return 1;
}int queueempty(linkqueue q)else
}
執行結果:
輸出的排版變了一下,別忘了。。。
深度優先遍歷 廣度優先遍歷
用棧進行儲存元素。訪問頂點 頂點入棧,以便記住它 標記頂點,以便不會再訪問它 2 訪問規則 a.如果可能,訪問乙個鄰接的未訪問頂點,標記它,併入棧。b.當不能執行a時 沒有鄰接的未訪問頂點 如果棧不為空,就從棧中彈出乙個頂點。c.如果不能執行規則a和b,就完成了整個搜尋過程。3 實現 基於以上規則,...
二叉樹的深度廣度遍歷
深度優先搜尋演算法 depth first search 是搜尋演算法的一種。是沿著樹的深度遍歷樹的節點,盡可能深的搜尋樹的分支。當節點v的所有邊都己被探尋過,搜尋將回溯到發現節點v的那條邊的起始節點。這一過程一直進行到已發現從源節點可達的所有節點為止。如果還存在未被發現的節點,則選擇其中乙個作為源...
樹的遍歷 深度優先遍歷和廣度優先遍歷
廣度優先遍歷,類似於樹的按層次遍歷。設圖g是連通的,且圖g的初態是所有頂點均未被訪問過。從圖g的任一頂點vi出發按廣度優先搜尋遍歷圖的步驟是 訪問vi後,依次訪問與vi鄰接的所有頂點w1,w2,w3.wn,再按w1,w2,w3.wn的順序訪問其中每個頂點的所有未被訪問的鄰接點,再按此順序,依次訪問它...