关于二叉搜索树的问题

时间:2010-10-28 20:56:24

标签: c# algorithm

我正在查看以下代码: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;
    }
}

由于

2 个答案:

答案 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甚至不知道它是在搜索列表还是树或其他什么。它只是需要迭代才能找到匹配。