0

几个小时以来,我一直在用头撞墙。我不知道该怎么做。我已经多次重组了我的功能,但仍然没有让它正常工作。

这是我的 c++ 课程中的编程作业。它必须有一个特定的形式,如数据类型、参数等,由讲师给出,所以我不能改变任何类似的东西。我们必须使用字符数组,因此使用 strcmp()。如果我们找到它,我们必须返回这个人,如果我们没有找到它,则返回 NULL。

这是我目前正在使用的内容:

person *classname::getPersonByName(char *name, person *rt)
{
    if (rt != NULL)
    {
        if (strcmp(rt->Title, title) == 0)
        {
            return rt;
        }
        else
        {
            getPersonByName(title, rt->left);
            getPersonByName(title, rt->right);
            //return NULL;
        }
    }
}

在调试中,它会按名称找到并返回该人。问题是,它会立即覆盖我的回报,因此不会以正确的人结束。

被注释掉的底部的 NULL 最终将每次调用都设置为 NULL,无论搜索是否找到它。

4

5 回答 5

2

为了使递归起作用,您需要返回从函数调用中获得的值。此外,您似乎正在将标题与名称混合在一起。

person * foundPerson = NULL;

else
{

     foundPerson = getPersonByName(title, rt->left);
     if(foundPerson != NULL) return foundPerson;
     return getPersonByName(title, rt->right);
     //return NULL;
} 
于 2012-08-01T02:10:01.227 回答
2

问题是,您没有从递归调用中返回任何内容。

这个想法其实并不难,只需翻译这个伪代码:

// This is mostly a procedural way from your method signature, though you are using C++...
Node getPersonByName(Node node, String name) {
    if (node is null) {
        return null
    }

    if (node.name == name) {
        return Node
    } 

    Node result = getPersonByName(node.left, name);
    if (result is not null) {  // found in node.left
        return result;
    }

    result = getPersonByName(node.right, name);
    if (result is not null) {  // found in node.right
        return result;
    }

    return null;
}

我将把它作为作业留给你把它翻译成 C/C++,并通过避免多个返回点使结构看起来更好

于 2012-08-01T02:13:55.120 回答
1

应该是这样的(首先,与您传递的名称进行比较(我假设这是您想要做的,其次,您的递归写错了,当递归左右子树时,Person*将返回给父调用函数,你也必须把它放在那里。):

person *classname::getPersonByName(char *name, person *rt)
{
    if (rt == NULL)
        return NULL;
    if (strcmp(rt->Title, name) == 0)
    {
        return rt;
    }
    Person *left = getPersonByName(name, rt->left);
    if(left!=NULL )
        return left;
    Person *right = getPersonByName(name, rt->right);
    if(right!=NULL)
            return right;
    return NULL;
 }
于 2012-08-01T02:10:48.707 回答
0

您正在传递title递归调用和字符串测试。你不应该使用name吗?我假设这title是当前节点的名称。

上课是classname为了什么?你肯定会做类似的事情:

person * person::findByName( char *name );
于 2012-08-01T02:10:23.393 回答
0

好久没做树搜索了,但是有一些逻辑比如
横树。树将具有小于树左侧的所有值和大于树右侧的值。这是伪代码。您可能想查找用于遍历树的算法。

while rt!=null
if name ==rt-> name return rt
else if name < rt->name then rt=rt->left //otherwise name is greater so on right side     

else rt=rt->right
end while

找不到名字

于 2012-08-02T00:35:18.937 回答