C ++-递归返回树

时间:2019-12-11 15:04:01

标签: c++ class recursion

class Person {
private:
    char* name;
    int numChildren;
    Person** childrenList;
public:
    Person(char* name);
    ~Person();
    // member functions
        // ...
};
  

假设我通过以下代码创建PersonPerson* me = new Person("Alex");,还将创建Alex的后代对象。对于特定实例,结构将如下所示:enter image description here

我想实现一个函数const Person* Person::findPerson(const Person* thisPerson, const char* target_name) const;,该函数搜索所有Person来查找一个name等于target_name的函数。
这是我的代码:

const Person* Person::findPerson(const Person* thisPerson, const char* target_name) const {
    if (strcmp(thisPerson->name(), target_name) == 0)
        return thisPerson;
    for (int i = 0; i < thisPerson->numChildren(); i++)
        findPerson(thisPerson->childrenList[i], target_name);
}

我认为代码可以工作,但是编译器认为它可能什么也不返回,也不让我编译它。而且,如果找不到任何人,我也不知道如何返回nullptr

1 个答案:

答案 0 :(得分:3)

您需要:

  1. return(如果成功)的递归调用结果
  2. return nullptr(如果找不到此人)
const Person* Person::findPerson(const Person* thisPerson, const char* target_name) const {
    if (strcmp(thisPerson->name(), target_name) == 0)
        return thisPerson;
    for (int i = 0; i < thisPerson->numChildren(); i++) {
        const Person *p = findPerson(thisPerson->childrenList[i], target_name);
        // Found in child tree? Return it (terminate recursion)
        if (p) return p;
    }
    // Not found in this branch of the tree
    return nullptr;
}

尽管将Person指针传递给Person成员函数似乎有些奇怪。另外,numChildrenname是成员变量,而不是函数。

应该不是:

const Person* Person::findPerson(const char* target_name) const {
    if (strcmp(name, target_name) == 0)
        return this;
    for (int i = 0; i < numChildren; i++) {
        const Person *p = childrenList[i]->findPerson(target_name);
        // Found in child tree? Return it (terminate recursion)
        if (p) return p;
    }
    // Not found in this branch of the tree
    return nullptr;
}

而且,我不得不问为什么不使用std::vectorstd::string而不是数组和char指针?