我试图了解一般的图形和特定的树的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);
}
}
我想知道为什么两者之间的排序不同。它应该是一样的吗?我认为我对算法的理解是错误的。有人可以请你纠正我吗?
答案 0 :(得分:1)
这是DFS的两种变体:预购和后订购。两者都有效;你使用哪一个取决于你试图解决的问题。
您恰好找到了一个后序树遍历和一个预订图遍历。它也可以走另一条路。
答案 1 :(得分:1)
在遍历图表中的节点时有两种变体:预订和后订购。在二叉树中,还有另一种选择:按顺序。有区别:
预购:在处理其邻居/子女之前,处理当前节点。
订购后:处理其邻居/子女后,处理当前节点。
按顺序:仅适用于二叉树。首先,处理左子,然后处理当前节点,最后是右子。
不同的变体在不同的情况下很有用,例如,按顺序遍历BST将按顺序给出它的元素。