图表和树之间的DFS差异

时间:2015-08-08 14:07:37

标签: algorithm data-structures

我试图了解一般的图形和特定的树的DFS算法。我注意到打印出的节点顺序对于图形和树木是不同的。

在Graphs中,我们打印父节点,然后打印子节点。

void Graph::DFS(int v)
{   
    // Mark the current node as visited and print it
    visited[v] = true;
    cout << v << " ";

    // Recur for all the vertices adjacent to this vertex
    vector<int>::iterator i;
    for (i = adj[v].begin(); i != adj[v].end(); ++i)
    if (!visited[*i])
        DFS(*i);

}

在树中,我们首先打印子节点,然后打印父节点

void DFS(struct node *head)
{
    if (head)
    {
        if (head->left)
        {
            DFS(head->left);
        }
        if (head->right)
        {
            DFS(head->right);
        }
        printf("%d  ", head->a);
    }
}

我想知道为什么两者之间的排序不同。它应该是一样的吗?我认为我对算法的理解是错误的。有人可以请你纠正我吗?

2 个答案:

答案 0 :(得分:1)

这是DFS的两种变体:预购和后订购。两者都有效;你使用哪一个取决于你试图解决的问题。

您恰好找到了一个后序树遍历和一个预订图遍历。它也可以走另一条路。

答案 1 :(得分:1)

在遍历图表中的节点时有两种变体:预订和后订购。在二叉树中,还有另一种选择:按顺序。有区别:

  1. 预购:在处理其邻居/子女之前,处理当前节点。

  2. 订购后处理其邻居/子女后,处理当前节点。

  3. 按顺序:仅适用于二叉树。首先,处理左子,然后处理当前节点,最后是右子。

  4. 不同的变体在不同的情况下很有用,例如,按顺序遍历BST将按顺序给出它的元素。