[英]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的兩個變體:預訂購和后訂購。 兩者都有效; 您使用哪一種取決於您要解決的問題。
您剛巧發現了一個后序樹遍歷和一個前序圖遍歷。 它也可能走了另一條路。
遍歷圖中的節點時,有兩種變體:前順序和后順序。 在二叉樹中,還有另一個選擇:按順序。 有區別:
預購 : 在處理當前節點的鄰居/子節點之前先對其進行處理。
Post-order :當前節點在處理其鄰居/子節點之后進行處理。
有序 :僅適用於二叉樹。 首先,處理左子節點,然后處理當前節點,最后處理右子節點。
不同的變體在不同情況下很有用,例如,按順序遍歷BST將按順序賦予其元素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.