C ++函数总是返回相同的指针

时间:2016-03-02 09:44:44

标签: c++ function pointers binary-search-tree

我试图实现一个从二叉树中搜索节点的函数,并返回指向找到的节点的Node指针,如下所示:

template <class T>
Node<T>* BST<T>::findNode(T a,Node<T>* node)
{
  cout<<node->value<<endl;
  if(a == node->value)
  {
    return node;
  }
  if(a < node->value)
  {
    if(node->left==NULL)
    {
      return NULL;
    }
    findNode(a, node->left);
  }
  if(a > node->value)
  {
    if(node->right==NULL)
    {
      return NULL;
    }
    findNode(a, node->right);
  }
}

在主程序中,我有一个指向二进制搜索树实例的指针(称为bst),该实例填充了一些节点。我声明了一个Node指针并调用了这样的函数:

    Node <int> * n = bst-> findNode(3,bst->head);

问题:如果找不到匹配的值,该函数效果很好,但是,如果找到匹配的值(即转到if(a==node->value) block,它将始终返回相同的值(在我的计算机中,节点n总是得到值0x6),它是如何发生的以及如何解决这个问题?

TIA !!

2 个答案:

答案 0 :(得分:4)

您的递归调用实际上并没有返回节点:它们需要看起来像

return findNode(a, node->left);

答案 1 :(得分:1)

该函数只有条件

的return语句
if(a == node->value)
{
    return node;
}

或类似的条件

if(node->left==NULL)
{
  return NULL;
}

在所有其他情况下,该函数具有未定义的行为。

此函数开头的语句

cout<<node->value<<endl;

以及上面显示的条件是错误的,因为通常node可以等于nullptr

我会按照以下方式编写函数

template <class T>
Node<T>* BST<T>::findNode( Node<T> *node, const T &value )
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
{
    if ( node == nullptr || node->value == value )
    {
        return node;
    }
    else if ( node->value < value )
    {
        return findNode( node->right, value );
    }
    else
    {
        return findNode( node->left, value );
    }
}