关于树视图中BFS或DFS递归的困惑

时间:2012-01-18 23:05:27

标签: c# tree

我正在树视图中进行一些处理,我不使用堆栈或队列来处理所有节点,我只是这样做:

void somemethod(TreeNode root){
    foreach(TreeNode item in root.Nodes)
    {
        //doSomething on item
        somemethod(item);
    }
 }

我是一个知道的知识块(无法清晰地思考),我无法看到我正在做什么样的树处理。这是BFS还是DFS还是两者都没有?

我的线索是DFS,但不确定。 CLR不会像处理两个兄弟姐妹那样做任何奇怪的事情,然后再利用多处理来传递它们吗?我觉得那种奇怪的强硬使我的判断蒙上阴影

2 个答案:

答案 0 :(得分:7)

您正在使用递归进行DFS(深度优先搜索/遍历)。

它的深度首先是因为递归的工作方式与堆栈的工作方式相同 - 在处理下一个节点之前处理当前节点的子节点 - 所以你先去深度而不是宽度。 / p>

修改

回复您的评论/更新问题:您的代码将逐项处理,不会有并行处理,也不会涉及“魔法”。使用递归的遍历相当于使用堆栈(LIFO = last in,first out) - 它只是隐式的。因此,您的方法也可以像下面那样编写,它产生相同的遍历顺序:

public void SomeMethod(TreeNode root)
{
    Stack<TreeNode> nodeStack = new Stack<TreeNode>();
    nodeStack.Push(root);

    while (nodeStack.Count > 0)
    {
        TreeNode node = nodeStack.Pop();
        //do something on item
        //need to push children in reverse order, so first child is pushed last
        foreach (TreeNode item in node.Nodes.Reverse())
            nodeStack.Push(item);
    }
}

我希望这能让所有内容更清晰 - 在处理控制台时将节点写入控制台或实际上使用调试器逐步完成操作可能对您有用。

(同样,递归方法和使用堆栈的方法都假设没有循环而且不测试 - 所以假设这是一棵树而不是任何图。对于后来的DFS引入{{1标记已经看到的节点的标志)

答案 1 :(得分:2)

我很确定你的例子对应于“深度优先搜索”,因为你“做某事”的节点在广度之前会增加深度。