以名称c ++遍历树

时间:2012-08-01 02:02:50

标签: c++ binary-tree traversal

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

这是我的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,无论搜索是否找到它。

5 个答案:

答案 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
找不到名字