2012-02-03 26 views
1

我理解廣度優先,但在處理一對多兒童關係時遇到問題。使用寬度優先遍歷時,如何在顯示樹時保持間距?

我的對象模型是父 - >兒童(很多)

隨着代碼,我現在,我只是寫一個字符串生成一個文件,但在未來我將使用Excel的自動化。

確切的問題是維護標籤,以便孩子正確顯示。每個孩子也可能有孩子。

{ 
     Queue<UserStory> storiesQueue = new Queue<UserStory>(); 
     StringBuilder printDocument = new StringBuilder(); 

     foreach (var userStorey in _rallyDownloader.GetUserStories().OrderBy(story => story.Name)) 
     { 
      storiesQueue.Enqueue(userStorey); 
     } 
     int tabs = 0; 
     while (storiesQueue.Count > 0) 
     { 
      string tab = ""; 
      for (int i = 0; i < tabs; i++) 
      { 
       tab += "|----"; 
      } 
      var story = storiesQueue.Dequeue(); 

      printDocument.Append(tab + story.Name + "\n"); 

      tabs++; 
      foreach (var child in story.Children) 
      { 
       string cTab = ""; 
       for (int i = 0; i < tabs; i++) 
       { 
        cTab += "|----"; 
       } 
       printDocument.Append(cTab + child.Name + "\n"); 

       foreach (var storey in child.Children) 
       { 
        storiesQueue.Enqueue(storey); 
       } 


      } 
     } 
    } 

我試圖保持原有的根數,並在到達終點,但有可能是一個更簡單的方法時,Tab鍵。

我避免遞歸,因爲我正在處理大型數據集並遇到內存問題。

我結束了使用堆棧的想法和創建此代碼。

StreamWriter stream = new StreamWriter(@"C:\awesomeSaucer.txt", true); 
     Stack<UserStory> storiesQueue = new Stack<UserStory>(); 
     Stack<string> indentation = new Stack<string>(); 

     foreach (var userStorey in _rallyDownloader.GetUserStories().OrderBy(story => story.Name)) 
     { 
      storiesQueue.Push(userStorey); 
      indentation.Push(""); 
     } 

     while (storiesQueue.Count > 0) 
     { 
      string tab = indentation.Pop(); 
      var story = storiesQueue.Pop(); 

      stream.WriteLine(tab + story.Name + "\n"); 

      // printDocument.Append(tab + story.Name + "\n"); 

      foreach (var child in story.Children) 
      { 
       indentation.Push(tab + "----"); 
       storiesQueue.Push(child); 
      } 
     } 
     stream.Close(); 
+2

這不是針對您的特定問題的解決方案,但它可能會激發解決方案;在這裏我向使用深度優先搜索解決這個問題的人們提出挑戰,並且我得到了幾十個有趣的解決方案:http://blogs.msdn.com/b/ericlippert/archive/2010/09/09/old-school-tree- display.aspx我的個人解決方案如下:http://blogs.msdn.com/b/ericlippert/archive/2010/09/09/eric-s-solution-for-old-school-tree-dumping.aspx – 2012-02-03 23:25:09

+0

謝謝,我會檢查一下。 – tylerjgarland 2012-02-03 23:34:05

回答

1

我會用一個堆棧,它反映了它的大小, 當遍歷元素是根據當前分支入棧和出棧你穿越的實際深度。 這也可以讓你繼續你的遍歷,而不會讓孩子入迷。 這樣,您的選項卡數將爲stack.Count() - 1,假定根節點具有0個選項卡。 基本思想是,如果你想避免由遞歸引起的線程堆棧溢出,你可以在堆上滾動你自己的堆棧。