2012-01-18 27 views
3

我做了一些處理。第TreeView中,我不使用既不是棧或隊列來處理所有的節點BFS或DFS遞歸混亂,我只是這樣做:關於一個TreeView

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

我是一個知情權(不能清楚地思考),我看不出我在做什麼樣的樹處理。這是BFS還是DFS或兩者都不是?

我的線索是DFS,但不確定。在利用多處理技術優先傳遞之前,CLR不會像處理兩個兄弟姐妹那樣做任何奇怪的事情嗎?那個奇怪的強硬在我的腦海中浮現出我的判斷

回答

7

您正在使用遞歸進行DFS(深度優先搜索/遍歷)。

深度首先是因爲遞歸的工作方式爲堆棧將相同的 - 你處理當前節點的孩子你處理下一個節點之前 - 讓你去深度優先,而不是廣度。

編輯:

在回答您的意見/更新的問題:你的代碼將通過項目處理順序的項目,不會有並行處理,沒有「神奇」的參與。使用遞歸的遍歷等價於使用堆棧(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引入一個visited標誌以標記已經看到的節點)

+0

我的線索是DFS,但不確定。在利用多處理技術優先傳遞之前,CLR不會像處理兩個兄弟姐妹那樣做任何奇怪的事情嗎?那個奇怪的強硬在我的腦海中浮現我的判斷 – mjsr 2012-01-18 23:26:28

+0

我要用我奇怪的東西來更新這個問題 – mjsr 2012-01-18 23:38:14

2

我很確定你的例子對應於「深度優先搜索」,因爲你「做某事」的節點在廣度之前深度增加。