最近在写数据结构实验,用到了图的深度遍历节点,记录一下。

深度遍历思路

比如这一个图,要从节点1开始,并访问与他有关的所有节点。深度遍历的思想就是从节点1开始,访问他的第一个子节点并操作,再从子节点开始访问子节点的子节点,直至访问完所有子节点,这就完成了与节点1关联的所有节点访问与操作.

clipboard.png

先访问1节点,将节点1设置为访问过状态,之后获取他所有的节点:

clipboard.png
从节点1的第一个子节点开始,访问节点2,将节点2设为访问过状态,对节点2进行操作,这时候再访问节点2的子节点,但并没有,所以结束.

clipboard.png

同理,访问节点1第二个字节点3,在访问子节点4:
clipboard.png

但此时节点4是有子节点的,获取节点4的所有子节点(这里只有节点5):
clipboard.png
访问节点5,将节点5设为访问过,获取节点5子节点

clipboard.png
访问节点5第一个子节点(也仅一个)为节点1,但节点1已经访问过了,所以不对节点1进行操作,只进行访问。
clipboard.png

直到最后访问完所有与1有关的节点,而节点10无关因此不访问.
clipboard.png

程序实现

很明显深度遍历是一个递归的操作,访问每一个节点,他所需要做的就是:
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]);
        }
    }
}

鲸冬香
456 声望27 粉丝