我一直在墙上撞了几个小时。我不知道该怎么做。我已经多次重构了我的功能,仍然没有让它正常工作。
这是我的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,无论搜索是否找到它。
答案 0 :(得分:2)
要使递归起作用,您需要返回从函数调用中获取的值。此外,看起来你正在将名称与名称混合。
person * foundPerson = NULL;
else
{
foundPerson = getPersonByName(title, rt->left);
if(foundPerson != NULL) return foundPerson;
return getPersonByName(title, rt->right);
//return NULL;
}
答案 1 :(得分: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 ++,并通过避免多个返回点使结构看起来更好
答案 2 :(得分:1)
它应该是这样的(首先,与您传递的名称进行比较(我假设这是您想要做的,其次,在递归左右子树时,您的递归被错误地写入,{{1}将被返回到父调用函数,你也必须在那里返回。):
Person*
答案 3 :(得分:0)
您正在将title
传递到递归调用和字符串测试中。你不应该使用name
吗?我假设title
是当前节点的名称。
什么是课程classname
?当然你会做类似的事情:
person * person::findByName( char *name );
答案 4 :(得分: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
找不到名字