一旦找到与节点键对应的值,我只需要将该节点返回到调用它的位置。
MovieNode *found = searchRecursive(root, title);
基于我的cout
语句,它已被发现,但当我在main()
中打印回来时,我会变得胡言乱语。有趣的是,当节点在main()
中打印时,该节点不为空,但它会多次打印问号图标和几个数字。
struct MovieNode{
int ranking;
std::string title;
int year;
int quantity;
MovieNode *parent;
MovieNode *left;
MovieNode *right;
MovieNode(){};
MovieNode(int in_ranking, std::string in_title, int in_year, int in_quantity)
{
ranking = in_ranking;
title = in_title;
year = in_year;
quantity = in_quantity;
parent = NULL;
left = NULL;
right = NULL;
}
};
MovieNode* MovieTree:: searchRecursive(MovieNode *node, std::string value)
{
if(node->left != NULL){
searchRecursive(node->left, value);
}
if(node->title == value){ //in order
cout<<"found"<<endl;
cout<<node->title<<endl;
return node;
}
if(node->right != NULL){
searchRecursive(node->right, value);
}
}
答案 0 :(得分:3)
而不只是调用searchRecursive(...)
执行此操作:
auto* r = searchRecusive(...)
if (r) return r;
在函数的末尾
return nullptr;
所以你得到:
MovieNode* MovieTree::searchRecursive(MovieNode* node, std::string const& value) {
if(node->left != nullptr) {
auto* r = searchRecursive(node->left, value);
if (r) return r;
}
if(node->title == value){ //in order
std::cout<<"found\n";
std::cout<<node->title<<std::endl;
return node;
}
if(node->right != nullptr) {
auto* r = searchRecursive(node->right, value);
if (r) return r;
}
return nullptr;
}
还有其他一些小修正。
答案 1 :(得分:0)
您的函数实现具有未定义的行为。首先,节点可以等于nullptr,其次,某些路径中的函数不返回任何内容。
该功能可以通过以下方式定义
MovieNode * MovieTree::searchRecursive(MovieNode *node, const std::string &value)
{
if ( node )
{
if ( value < node->title )
{
node = searchRecursive(node->left, value);
}
else if ( node->title < value )
{
node = searchRecursive(node->right, value);
}
}
return node;
}
我认为树是根据数据成员标题排序的。