C++ 按名称c+遍历树+;

C++ 按名称c+遍历树+;,c++,binary-tree,traversal,C++,Binary Tree,Traversal,几个小时来,我一直在为这件事头痛不已。我不知道该怎么办。我已经多次重新构造了我的函数,但仍然没有让它正常工作 这是我C++类中的一个编程任务。它必须有一个特定的形式,如数据类型、参数等,由讲师给出,所以我不能更改任何类似的内容。我们必须使用字符数组,因此strcmp()。如果我们找到这个人,就必须返回它,如果我们没有找到,就必须返回NULL 以下是我目前的工作内容: person *classname::getPersonByName(char *name, person *rt) {

几个小时来,我一直在为这件事头痛不已。我不知道该怎么办。我已经多次重新构造了我的函数,但仍然没有让它正常工作

这是我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;
        }
    }
}
在debug中,它会找到并返回一个名字很好的人。问题是,它会立即覆盖我的报税表,因此不会找到正确的人


底部被注释掉的NULL最终会将每次调用设置为NULL,而不管搜索是否找到它

要使递归工作,您需要返回从函数调用中获得的值。除此之外,看起来你把头衔和名字混在一起了

person * foundPerson = NULL;

else
{

     foundPerson = getPersonByName(title, rt->left);
     if(foundPerson != NULL) return foundPerson;
     return getPersonByName(title, rt->right);
     //return NULL;
} 

为了使递归工作,您需要返回从函数调用中获得的值。除此之外,看起来你把头衔和名字混在一起了

person * foundPerson = NULL;

else
{

     foundPerson = getPersonByName(title, rt->left);
     if(foundPerson != NULL) return foundPerson;
     return getPersonByName(title, rt->right);
     //return NULL;
} 

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

类的名称是什么?你肯定会这样做:

person * person::findByName( char *name );

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

类的名称是什么?你肯定会这样做:

person * person::findByName( char *name );
它应该是这样的(首先,与您传递的名称比较(我假设这就是您想要做的,其次,您的递归写错了,当沿着左子树和右子树递归时,
Person*
将返回到父调用函数,您也必须在那里返回它):

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


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

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

// 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++,并通过避免多个返回点使结构看起来更好。问题是,您没有从递归调用返回任何内容

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

// 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++,并通过避免多个返回点使结构看起来更好 横向遍历树。树的所有值都小于树左侧的值,大于树右侧的值。这是伪代码。您可能需要查找遍历树的算法

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
而rt!=null
如果name==rt->name返回rt
否则,如果名称name,则rt=rt->left//否则名称更大,因此右侧的名称更大
else rt=rt->right
结束时

找不到名称

我已经很久没有进行树搜索了,但是有一些逻辑,例如
横向遍历树。树的所有值都小于树左侧的值,大于树右侧的值。这是伪代码。您可能需要查找遍历树的算法

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
而rt!=null
如果name==rt->name返回rt
否则,如果名称name,则rt=rt->left//否则名称更大,因此右侧的名称更大
else rt=rt->right
结束时

名称未找到

什么是
标题
以及为什么
名称
未使用?这里有一个提示:为什么函数的签名中有一个
人物*
?什么是
标题
以及为什么
名称
未使用?这里有一个提示:为什么函数的签名中有一个
人物*
?您应该将其添加为一个命令因为你没有真正回答这个问题。是的,应该回答。我改变了问题的性质,意外地遗漏了这一部分。最初的作业是给图书馆的,不是给人的,你按书名搜索书籍。我的b.类名是library。@jskiles1事实上,这只是一个糟糕的答案。我认为问题在于答案不对事情正在测试中,没有注意到返回值有问题。你应该添加这个作为注释,因为你没有真正回答这个问题。是的,应该。我改变了问题的性质,意外地遗漏了那部分。最初的作业是给图书馆的,而不是个人的,你可以按书名搜索书籍。我的b。类名是库。@jskiles1事实上这只是一个错误的答案。我认为问题在于测试的东西是错误的,而没有注意到返回值是错误的。如果station在那里的结尾……如果是真的,那又有什么关系?或者它有什么关系?啊,好的,我现在看到了。谢谢。如果station在那里的结尾……如果是真的,那又有什么关系还是有关系?啊,好吧,我现在明白了。谢谢。非常感谢。递归只是让我有点头晕目眩。我有一种感觉,在我明白之前,我无法停止思考……我只是强迫症。我记得我在joelonsoftware.com上读到过,他说有些人永远无法通过考试尽管“递归”和“指针”的障碍,即使他们尝试了多年。我希望你不是那种人;)非常感谢你。递归