2012-08-01 121 views
0

我一直在我的头上靠着墙壁打了几个小时。我不知道该怎么做。我重构了我的函数几次,仍然没有得到它的正常工作。按名称遍历一棵树C++

这是用于我的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

什么是'title',为什么'name'闲置? – 2012-08-01 02:06:44

+0

这里有一个提示:为什么函数在签名中有'person *'? – irrelephant 2012-08-01 02:09:16

回答

2

的问题是,你是不是从递归调用返回任何东西

这个想法没什么不同ficult其实只是翻译这个伪代码:

// 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++,使结构看起来避免收益的多点更好

+0

非常感谢。递归只是让我的头脑旋转了一下。我有一种感觉,我将无法停止思考,直到我得到它.....我只是这样的强迫症。 :D – Nick 2012-08-01 02:27:57

+0

我记得我在joelonsoftware.com上读到过,他说,即使他们尝试了多年,有些人永远也无法通过“递归”和“指针”屏障。我希望你不是那种人;) – 2012-08-01 02:34:10

2

对于递归工作,您需要将从调用获得的值返回给函数。除此之外,你看起来像是混合了标题和名字。

person * foundPerson = NULL; 

else 
{ 

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

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

什么是类classname?当然,你会做这样的:

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

大声笑,哦,我错过了这一点=) – paddy 2012-08-01 02:11:35

+0

你应该添加这个作为评论,因为你没有真正回答这个问题。 – 2012-08-01 02:12:09

+0

是的,它应该。我改变了这个问题的性质,并在意外事件中放弃了这部分。原来的作业是针对图书馆而不是个人,并且您按标题搜索书籍。我的b。 classname是库。 – Nick 2012-08-01 02:12:14

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; 
} 
+0

那如果说法末尾有.....如果是真的,那又怎么样?或者它有什么关系?啊,好吧,我现在看到它。谢谢。 – Nick 2012-08-01 02:15:03

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 

找不到名称