2010-10-28 133 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声明时,将其视为暂停执行。当从调用代码迭代到下一个值时,将继续执行该可能返回更多值的位置。

查找将获得遍历的结果,并返回存储的值(如果在其中一个节点中找到)。