【问题标题】:C++ Function always returns the same pointerC++ 函数总是返回相同的指针
【发布时间】:2016-03-02 09:44:44
【问题描述】:

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

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 <int> * n = bst-> findNode(3,bst->head);

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

TIA!!

【问题讨论】:

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


    【解决方案1】:

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

    return findNode(a, node->left);
    

    【讨论】:

      【解决方案2】:

      函数只有条件的返回语句

      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 );
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-17
        • 1970-01-01
        • 1970-01-01
        • 2020-04-29
        • 2012-02-26
        • 2010-12-25
        相关资源
        最近更新 更多