2010-10-28 140 views
0

我在看下面的代碼:http://netrsc.blogspot.com/2010/04/net-c-binary-tree.html問題上的二叉搜索樹

我是正確的思維是,while (!Found)條件會遍歷樹?

protected void Insert(T item) 
{ 
    TreeNode<T> TempNode = Root; 
    bool Found=false; 
    while (!Found) 
    { 
     int ComparedValue = TempNode.Value.CompareTo(item); 
     if(ComparedValue<0) 
     { 
      if(TempNode.Left==null) 
      { 
       TempNode.Left=new TreeNode<T>(item,TempNode); 
       ++NumberOfNodes; 
       return; 
      } 
      else 
      { 
       TempNode=TempNode.Left; 
      } 
     } 
     else if(ComparedValue>0) 
     { 
      if(TempNode.Right==null) 
      { 
       TempNode.Right=new TreeNode<T>(item,TempNode); 
       ++NumberOfNodes; 
       return; 
      } 
      else 
      { 
       TempNode=TempNode.Right; 
      } 
     } 
     else 
     { 
      TempNode=TempNode.Right; 
     } 
    } 
} 

此外,對於查找和遍歷方法,這些工作是如何工作的?如果沒有從Traversal方法返回,而是從左分支返回,那麼Find中的循環會再次執行嗎?它如何知道執行正確的分支?

protected IEnumerable<TreeNode<T>> Traversal(TreeNode<T> Node) 
{ 
    if (Node.Left != null) 
    { 
     foreach (TreeNode<T> LeftNode in Traversal(Node.Left)) 
      yield return LeftNode; 
    } 
    yield return Node; 
    if (Node.Right != null) 
    { 
     foreach (TreeNode<T> RightNode in Traversal(Node.Right)) 
      yield return RightNode; 
    } 
} 

感謝

回答

0

迭代樹的示例在Find命令中,該命令調用Traversal函數。

foreach (TreeNode<T> Item in Traversal(Root)) 

Traversal函數將返回迭代中的項目樹深度優先,從左向右的方式。如果您查看Traversal代碼,它會在左側遞歸調用自身,然後在右側遞歸地調用它自己。

Traversal將整個樹返回到一個可迭代對象中,其中的項目按深度優先,從左到右排序。 Find命令簡單地循環遍歷每一個,當它碰到一個匹配時就會返回它的循環。基本上,Traversal返回一個有序的迭代項,Find通過該列表尋找匹配項。 Find實際上甚至不必知道它是通過列表或樹或其他搜索來搜索。它只是需要一些迭代來找到匹配。

0

不一定。它只會遍歷應該添加插入節點的路徑上的節點。在這個循環中有一些return語句,所以當它找到正確的位置並添加新節點時,它基本上會停止。代之以將Found變量設置爲true會更合適(在代碼中)。

遍歷方法返回左側和右側子樹的節點。您應該注意它使用yield return而不是簡單的return。使用它會創建一個枚舉器,其中每個產生的項目是分子在迭代時返回的內容。當它達到yield return聲明時,將其視爲暫停執行。當從調用代碼迭代到下一個值時,將繼續執行該可能返回更多值的位置。

查找將獲得遍歷的結果,並返回存儲的值(如果在其中一個節點中找到)。