👋 Hi, I’m @Beast Cheng
👀 I’m interested in photography, hiking, landscape…
🌱 I’m currently learning python, javascript, kotlin…
📫 How to reach me --> 458290771@qq.com
喜欢《数据结构》部分笔记的小伙伴可以订阅专栏,今后还会不断更新。🧑💻
感兴趣的小伙伴可以点一下订阅、收藏、关注!🚀
谢谢大家!🙏
回顾树的先根遍历
void PreOrder(TreeNode *R)
{if (R != NULL){visit(R); // 访问根结点while (R还有下一个子树T)PreOder(T); // 先根遍历下一棵子树}
}
图的深度优先遍历-代码实现
bool visited[MAX_VERTEX_NUM]; // 访问标记数组void DFS (Graph G, int v) // 从顶点v出发,深度优先遍历图G
{visit(v); // 访问顶点vvisited[v] = TRUE; // 设已访问标记for (w = FirstNeighbor(G, v); w >= 0; w = NextNeighbor(G, v, w))if (!visited[w]) // w为v的尚未访问的邻接结点{DFS(G, w);} // if
}
如果是非连通图,则无法遍历所有结点
解决方法类似:完成遍历之后,可以再进行一次扫描,如果发现有结点仍然是false
,那就说明与之对应的结点是没有被访问过的
也就是要加上如下代码之后再进行深度优先遍历
void DFSTraverse(Graph G) // 对图G进行深度优先遍历
{for(v = 0; v < G.vexnum; ++v)visited[v] = FALSE; // 初始化已访问标记数据for(v = 0; v < G.vexnum; ++v) // 本代码中是从v=0开始遍历if(!visited[v])DFS(G, v);
}
深度优先遍历序列
同一个图的邻接矩阵表示方式唯一,因此深度深度优先遍历序列唯一
同一个图的邻接表表示方式不唯一,因此深度优先遍历序列不唯一
此外,还有深度优先生成树、深度优先生成森林
图的遍历和图的连通性
对无向图进行BFS/DFS遍历
调用BFS/DFS函数的次数 = 连通分量数
对于连通图,只需要调用一次BFS/DFS
对有向图进行BFS/DFS遍历
调用BFS/DFS函数的次数要具体分析
如果起始顶点到其他各顶点都有路径,则只需调用一次BFS/DFS函数
对于强连通图,从任一结点出发都只需调用一次BFS/DFS