【问题标题】:How to add elements in Binary search tree iteratively?如何迭代地在二叉搜索树中添加元素?
【发布时间】:2014-06-10 03:50:23
【问题描述】:
   public void Insert(int value)
    {
        if (value < Data)
        {
            if (LeftNode == null)
            {
                LeftNode = new TreeNode(value);
            }
            else
            {
                LeftNode.Insert(value);
            }
        }
        else if (value > Data)
        {
            if (RightNode == null)
            {
                RightNode = new TreeNode(value);
            }
            else
            {
                RightNode.Insert(value);
            }
        }
    }

我编写了在 BST 中递归添加元素的方法,它检查值以添加小于或大于并将其添加到适当的位置,但我想知道迭代方法是如何工作的?我的 BST 需要迭代添加方法。

【问题讨论】:

  • 是的,非递归方法,实际上我正在从包含大约 10000 个单词的文本文件中读取数据,当我将它们添加到 BST 时,它给了我堆栈溢出异常。我认为递归方法是问题所在。
  • 他尝试了什么?他已经放下了他的方法……
  • @Aki: 输入文件排序了吗?如果是这样,您正在构建一个链表而不是二叉树。每个元素都将添加到右侧。

标签: c# visual-studio-2010 binary-tree


【解决方案1】:

好的,这是您算法的迭代版本:

public void Insert(int value)
{
    TreeNode current = this;
    while (current != null)
    {
        if(current.Data < value)
            if(current.LeftNode == null)
            { current.LeftNode = new TreeNode(value); break; }
            else current = current.LeftNode;
        else
            if(current.RightNode == null)
            { current.RightNode = new TreeNode(value); break; }
            else current = current.RightNode;
    }
}

【讨论】:

  • 我认为值得一提的是:通常 BST 中的节点应该在其左子树中具有较低的键,在右侧具有较高的键。但是,此算法的工作方式相反。
【解决方案2】:

你可以在 wikipedia 上找到 Java 的实现,和 C# 非常相似 http://en.wikipedia.org/wiki/Binary_search_tree

我们从根开始:

Node root = m_root;
    while (root != null) {

然后查看该值是否小于 os 大于 root。

if (data < root.getData()) {

现在我们知道我们需要从左侧还是右侧遍历。左右两边的逻辑是一样的。我们查看槽是否为空,如果是,我们将值放在该槽中。

if (root.getLeft() == null) {
    root.setLeft(new TreeNode(data, null, null));
    return;
}

如果 slot 包含一个值,那么我们将该 slot 设置为 root 并继续该过程。

} else {
    root = root.getLeft();
}

【讨论】:

  • 问题在于它是如何工作的,而不是要求实现。
  • 代码很简单,解释一下大概就是解释每一行是做什么的,不过我可以帮你做
【解决方案3】:

迭代方法是一种会重复的方法。

迭代方法意味着它会被重复调用。 递归意味着该方法将调用自身 n 次,其中 n > 0。

搜索二叉搜索树是使用调用自身(递归)直到找到分支结尾的方法完成的。

要进行插入,执行搜索以找到放置节点的正确位置。

【讨论】:

  • Russel,我知道迭代方法使用循环而不是调用自身。任何使用递归的方法,理论上都可以使用循环来完成,但递归更容易清理。两个世界中最好的是尾递归
  • @Fujiy 方法内的循环是方法内的迭代表达式。迭代方法是循环本身的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-06
  • 1970-01-01
  • 1970-01-01
  • 2012-10-17
  • 2017-05-09
  • 2015-01-18
  • 2013-02-07
相关资源
最近更新 更多