StackOverflowException

StackOverflowException

我一直在尝试将contains方法实现到我的bstree类中,该类将接受一个值,然后检查所有节点,看看它是否包含在树中。我认为算法是正确的,但是我不知道为什么我在第一个if语句中总是得到stackoverflowexception。有什么想法吗?

public Boolean Contains(T item)
    {
      Node<T> node = root;
      return contains(root, item);
    }



    private Boolean contains(Node<T> node, T item)
    {
      if (item.CompareTo(root.Data) == 0)
      {
        return true;//return 0 if found
      }
      else
      {
        if (item.CompareTo(root.Data) > 0)
        {
          //root = node.Left;
          Node<T> left = root.Left;
          return(contains(root, item));
        }
        else
        {
          if (item.CompareTo(root.Data) < 0)
          {
            //root = node.Right;
            Node<T> right = root.Right;
            return(contains(root, item));
          }
          else
          {
            return false;//return 1 if not found
          }
        }
      }
    }

最佳答案

代码的问题是将错误的节点传递到递归调用中。例如,假设您的元素比树中的所有元素都小然后,在第一个递归调用中,您将看到以下语句:

Node<T> left = root.Left;
return(contains(root, item));

这意味着递归在根节点上,而不是在左子节点上。因此,在下一次迭代中,您将发现元素小于根的右子元素,因此您将再次执行完全相同的语句,递归地重复调用相同的函数,直到堆栈空间用完为止。
要解决这个问题,您应该将上面的代码改为
Node<T> left = node.Left;
return(contains(left, item));

这表示查看当前节点的左子树,而不是根节点本身。类似地,您将需要为右分支更新相应的大小写。
最后,要完成这项工作,您需要向递归函数添加一个基本情况,该函数处理树null的情况,这可能是因为您已经离开了树,也可能是树开始是空的我把这个留作练习:-)

关于c# - BST算法中的StackOverFlowException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7005632/

10-10 00:18