簡體   English   中英

圖和樹之間的DFS差異

[英]DFS difference between graph and tree

我試圖了解一般圖和特定樹的DFS算法。 我注意到圖和樹的節點打印順序不同。

在“圖形”中,我們先打印父節點,然后再打印子節點。

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);
    }
}

我想知道為什么兩者之間的順序不同。 應該一樣嗎? 我認為我對算法的理解是錯誤的。 有人可以在這方面糾正我嗎?

這是DFS的兩個變體:預訂購和后訂購。 兩者都有效; 您使用哪一種取決於您要解決的問題。

您剛巧發現了一個后序樹遍歷和一個前序圖遍歷。 它也可能走了另一條路。

遍歷圖中的節點時,有兩種變體:前順序和后順序。 在二叉樹中,還有另一個選擇:按順序。 有區別:

  1. 預購處理當前節點的鄰居/子節點之前先對其進行處理。

  2. Post-order :當前節點處理其鄰居/子節點之后進行處理。

  3. 有序 :僅適用於二叉樹。 首先,處理左子節點,然后處理當前節點,最后處理右子節點。

不同的變體在不同情況下很有用,例如,按順序遍歷BST將按順序賦予其元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM