我试图实现一个从二叉树中搜索节点的函数,并返回指向找到的节点的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 !!
答案 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 );
}
}