我正在查看以下代码: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 :(得分:0)
不一定。它只会遍历应该添加插入节点的路径上的节点。在该循环中有一些return
语句,因此当它找到正确的位置并添加新节点时它将基本停止。将Found
变量设置为true
会更合适(在代码中)。
遍历方法返回左右子树的节点。您应该注意它使用yield return
而不是普通return
。使用它创建一个枚举器,其中每个产生的项目是分子在迭代时返回的值。当它达到yield return
语句时,将其视为暂停执行。当从调用代码迭代到下一个值时,在该点继续执行可能返回更多值。
Find将获取遍历的结果,如果在其中一个节点中找到,则返回存储的值。
答案 1 :(得分:0)
迭代树的示例在Find
命令中,该命令调用Traversal
函数。
foreach (TreeNode<T> Item in Traversal(Root))
Traversal
函数将以深度优先,从左到右的方式迭代地返回树中的项目。如果查看Traversal
代码,它会在左侧递归调用自身,然后在右侧递归调用。
Traversal
在可迭代对象中返回整个树,其中项目按深度优先,从左到右排序。 Find
命令只是循环遍历每个命令,当它命中匹配时,它会退出循环。基本上,Traversal
返回一个有序的可迭代项目,Find
通过该列表查找匹配项。 Find
甚至不知道它是在搜索列表还是树或其他什么。它只是需要迭代才能找到匹配。