【问题标题】:How to get sum of nodes of a tree which has children in a list?如何获取列表中有子节点的树的节点总和?
【发布时间】:2020-01-16 23:35:51
【问题描述】:

所以我有一棵像这样的树:

class Tree{
public:
int data1;
string data2;
Animal animal;
std::list<Tree> children;
};

我正在尝试计算奇数级别的data1 节点的总和,但我无法这样做。我这样计算所有节点的总和:

int addData1(const Tree* t, int sum){
    if(t == nullptr) {
        return sum;
    }
    else{
        int temp = 0;
        std::list<Tree> forest = t->children;
        std::list<Tree>::iterator it;

        for(it = forest.begin(); it != forest.end(); ++it){
            Tree curr = *it;
            temp += addData1(&curr, sum);
        }

        return t->data1 + temp;
    }
}

但是对于奇数级别我无法这样做,我这样尝试过,但我得到的总和不正确:

int addData1Odd(const Tree* t, bool odd, int sum){
    if(t == nullptr){
        return sum;
    }
    else{
        int temp = 0;
        std::list<Tree> forest = t->children;
        std::list<Tree>::iterator it;

        for(it = forest.begin(); it != forest.end(); ++it){
            Tree curr = *it;
            if(odd)
                temp += addData1Odd(&curr, !odd, sum);
        }

        return t->data1 + temp;
    }
}

我将不胜感激。

【问题讨论】:

  • 虽然递归代码可能很麻烦,但您是否尝试过在调试器中单步执行您的代码?
  • @Someprogrammerdude 我也试过了,但这很令人困惑,我假设我的思考方式有问题

标签: c++ algorithm tree tree-traversal


【解决方案1】:

如果您不在奇数级别,您将停止递归。您仍然应该递归,但不要将其添加到您的总和中

编辑: 试试这个:

    for(it = forest.begin(); it != forest.end(); ++it){
        Tree curr = *it;
        temp += addData1Odd(&curr, !odd, sum);
    }

    if (odd)
       return t->data1 + temp;
    else
       return temp;

【讨论】:

  • 我认为这也是我在实现中尝试过的,但它不起作用。
  • 嗨熊猫,我已经用代码示例更新了我的答案
  • 另外注意这里可以使用基于范围的for循环,这样更不容易出错。欲了解更多信息:en.cppreference.com/w/cpp/language/range-for
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
  • 2014-12-19
  • 1970-01-01
  • 1970-01-01
  • 2011-09-10
  • 2021-07-10
相关资源
最近更新 更多