最近在写数据结构实验,用到了图的深度遍历节点,记录一下。
深度遍历思路
比如这一个图,要从节点1开始,并访问与他有关的所有节点。深度遍历的思想就是从节点1开始,访问他的第一个子节点并操作,再从子节点开始访问子节点的子节点,直至访问完所有子节点,这就完成了与节点1关联的所有节点访问与操作.
先访问1节点,将节点1设置为访问过状态,之后获取他所有的节点:
从节点1的第一个子节点开始,访问节点2,将节点2设为访问过状态,对节点2进行操作,这时候再访问节点2的子节点,但并没有,所以结束.
同理,访问节点1第二个字节点3,在访问子节点4:
但此时节点4是有子节点的,获取节点4的所有子节点(这里只有节点5):
访问节点5,将节点5设为访问过,获取节点5子节点
访问节点5第一个子节点(也仅一个)为节点1,但节点1已经访问过了,所以不对节点1进行操作,只进行访问。
直到最后访问完所有与1有关的节点,而节点10无关因此不访问.
程序实现
很明显深度遍历是一个递归的操作,访问每一个节点,他所需要做的就是:
1.判断是否访问过,若访问过则返回
2.若未访问:对节点进行操作,并设置为访问过状态,对所有子节点进行访问
因此可以用一个简单的递归函数实现:
/**
* 对节点深度遍历
* @param node
*/
void DFS(Node *node) {
if (!node->vistited) {
node->vistited = true;
visiNode(node); //这里为对节点操作的函数 自定义
for (int i = 0; i < node->nodes.size(); ++i) {
DFS(node->nodes[i]);
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。