深度廣度優先遍歷最小生成樹

2021-07-08 14:30:26 字數 3071 閱讀 7565

怎麼用圖的深度和廣度優先遍歷來遍歷樹呢?我是這樣想的,把樹構造成圖就行了。

//#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的順序訪問其中每個頂點的所有未被訪問的鄰接點,再按此順序,依次訪問它...